[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種類のツリーを作ることが出来ます(右上のボタンで切り替える)
導出ツリーは、主に文法のデバッグに使用します。導出ツリーは単に文をツリーに変換するだけで、非終端子が連続して長くなりがちです。実際にツリーに意味を与えてやるには 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 には、似たような形式のデータ構造がいくつもあってややこしいです。

その他気づいたこと


Links to this Page

propella home