作成される構文木のクラスについて

構文木の各ノードはProduction(もしくはAbstract Syntax Tree)とTokenの識別子に対応して作成されます。

TokenはTokenクラスを継承したクラスになります。
クラス名はTに続いて最初を大文字にして_を削除して_に続く一文字を大文字にした物になります。

normal_token → TNormalToken
special_token → TSpecialToken

また、プロパティとしてtextとlineとposを持ちます。それぞれLexerの認識した文字列、出現した行番号、出現したカラムとなります。

Productionは少し複雑です。Node抽象クラスを継承したProductionの識別子を元にした抽象クラスが作成され、その後各Alternative毎に具象クラスが作成されます。具象クラス内で構文規則中の要素についてはPropertyとして定義されます。

分かりにくいので例で。

expr =
   {add} [left]:num plus [right]:num
 | {sub} [left]:num minus [right]:num
;

上記の様な書き方の場合まず、抽象クラスPExpr(Production Expr)が定義されます。
次に、それを継承してAAddExpr(Alternative Add Expr), ASubExpr(Alternative Sub Expr)というクラスが定義されます。
また、各AXxxExprは、ノードを構成する子ノードとしてTNumクラスのleftというPropertyとTNumクラスのrightというProperty、TPlusのplusというPropertyを持つ事になります。

なお、要素の後ろに*や+を指定した場合、PropertyはLinkedListのCollectionとなります。

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.