ANTLRWorksでツリー文法をテストするときにASTを入力として指定する方法を教えてください。
ASTを提供する必要はありませんが、ASTを作成するパーサーのみを指定する必要はありません。
はASTを生成し、次の文法を考える:
grammar ASTDemo;
options {
output=AST;
}
tokens {
ROOT;
U_MIN;
}
parse
: expression EOF -> ^(ROOT expression)
;
expression
: addition
;
addition
: multiplication (('+' | '-')^ multiplication)*
;
multiplication
: unary (('*' | '/')^ unary)*
;
unary
: '-' atom -> ^(U_MIN atom)
| atom
;
atom
: ID
| NUMBER
| '(' expression ')' -> expression
;
ID : ('a'..'z' | 'A'..'Z')+;
NUMBER : '0'..'9'+ ('.' '0'..'9'*)?;
SPACE : (' ' | '\t' | '\r' | '\n')+ {skip();};
上の文法によって生成さASTのツリー文法になり、次の
tree grammar ASTDemoWalker;
options {
output=AST;
tokenVocab=ASTDemo;
ASTLabelType=CommonTree;
}
parse
: ^(ROOT expression)
;
expression
: ^('+' expression expression)
| ^('-' expression expression)
| ^('*' expression expression)
| ^('/' expression expression)
| ^(U_MIN expression)
| atom
;
atom
: ID
| NUMBER
;
ASTDemo.g
とASTDemoWalker.g
の両方を置くことを確認してください同じフォルダにあります。 ANTLRWorksの両方文法を開き、ASTDemoWalker.g
を開き、CTRL + SHIFT + Gを押してツリーウォーカーを生成その後CTRL + SHIFT + Gを押すことによって第ASTDemo.g
からレクサー&パーサを生成します。
は今、ASTDemoWalker.g
エディタパネルから、CTRL + Dを押してデバッガを起動し、テキスト領域に次のソースを貼り付けます。
42 * ((a + 3)/-3.14)
とOKを押してください。
これで、デバッグプロセスをステップすることができ、最後に、あなたは、生成されたパーザASTの両方何を参照することができます。
とどのようにウォーカーが歩いツリーがASTを言った:
あなたが今、ツリー文法における「偶然の」ミスをした場合、あなたは^('*' expression)
を定義する代わりに^('*' expression expression)
の、と言います。(ツリーウォーカーは期待しながら、42
ノードの後に別のノードがあるASTで
のみ1つのノードを:あなたは再び木文法をデバッグする場合、あなたはそれが42
ノードを通過した後に失敗が表示されます42
)をルートノードの後ろに置きます。
もちろん、これは簡単な文法ですが、ANTLRに精通していても、@ $ &の痛みがあり、ツリー文法のエラーを追跡することがあります。 :)
あなたの貴重なヘルプ@Bart Kiersのおかげで、私はANTLRWorksの文法とツリー文法の両方で作業することを考えました。 - 真面目、あなたがまだ始まっていないなら、あなたはANTLRに関する本を書くべきです。 –
おかげさまで@ ndroock1、あなたはもちろん歓迎です。いいえ、私は本を始めることはありません:)私はしばらくブログを貼りつづけて、SOの質問に答えると思います。 –