[View] [Edit] [Attachments] [History] [Home] [Changes] [Search] [Help]
T-Gen勉強メモ
最初のトレース
TranslatorGenerator example1 のサンプルを左下にコピー accept
右下に aabb を書く
右下窓のインスペクタから
self halt; accept
スキャナの仕組みを調べる
TranslatorGenerator example2 で実験
スキャナ(左上)を accept してトレース。tokenSpecification に入れるだけ。
パーサ(左下)を accept
TranslatorGenerator>>acceptGrammarSpec:from: が呼び出される
a TGenUI から見て self generator parser scanner にスキャナがセットされる
スキャナがどうやって初期化されるかを調べる。
例えばこういうメソッドによって好きなスキャナを作る事ができます。
tgenScanner: tokenSpecification
"MyNote tgenScanner: '<number> : [0-9] ;'"
| tgen tokenSpecNode rules scanner litDict |
tgen _ TranslatorGenerator new.
tokenSpecNode _ tgen tokenSpecParser
parseForAST: tokenSpecification
ifFail: [self halt].
rules _ tokenSpecNode asSpecRuleList.
litDict _ Dictionary new.
scanner _ tgen buildScannerFromRules: rules withLiteralDict: litDict.
^ scanner
self scanSource: 'test + 1'.
self token. - 現在のトークン 終わりの時は ^D
self tokenType. - 現在のトークンの型
self scanToken. - 次のトークンへ移動
パーサの動きを調べる
TGen は 3種類のツリーを作ることが出来ます(右上のボタンで切り替える)
- 導出(derivation)ツリー - 兎に角ツリーを作ります。
- 抽象文法ツリー(AST) - 実際にはこちらを使う。
- ニセ抽象文法ツリー - 形だけのAST
導出ツリーは、主に文法のデバッグに使用します。導出ツリーは単に文をツリーに変換するだけで、非終端子が連続して長くなりがちです。実際にツリーに意味を与えてやるには AST を使います。二種類のASTツリーを作る為には解析ツリー生成子(PTB) が必要です。
accept してからツリーが出来るまでの流れ
TranslatorGenerator>>acceptGrammarSpec:from:
BNF を解析するためのパーサとスキャナを設定する。
TranslatorGenerator>>buildParserIfFail:
解析する。
tokenSpecNode := self tokenSpecParser parseForAST: self tokenSpecification ifFail: aBlock.
によってスキャナの文法が解析される
grammarNode := self grammarSpecParser parseForAST: self grammarSpecification ifFail: aBlock.
によってパーサの文法が解析される。
TGen 自身の文法を作って見る
TGen 自身も TGen によって作られているので、このパーサを作って見ることにより TGen の動作が良くわかります。
GrammarSpecScanner class>>initialize
GrammarSpecParser class>>initialize
にそれぞれ正規表現とBNFの定義が書かれています。
注意点としては、
データ構造
TGen には、似たような形式のデータ構造がいくつもあってややこしいです。
- TreeNode 最初に作るツリー
- GrammarProduction TreeNode から作られる。文法を表す。
- AbstractParser 文法を表す。
その他気づいたこと
- マニュアルにはスキャナ定義の \xff が文字コード 254 として認識されているとあるが、\xFF (つまり大文字) しか見ていない。
- そもそも 8bit clean では無い、これが問題になったらコードの中の 127 を 255 に変えれば動く?!
Links to this Page
- 言語ゲーム last edited on 19 March 2005 at 2:04:01 pm by 192.168.0.8
- T-Gen last edited on 19 March 2005 at 2:12:40 pm by 192.168.0.8