1

C 文法を使用して AST を作成しようとしています。ここで見つけることができます。ただし、操作の優先順位は考慮されていません。たとえば、次のコードを入力した場合です。

 l = k*j*5 - 10;

私はこれを得る:

AST

操作は次のコードによって管理されます。

multiplicative_expression
: primary_expression (('*'^ additive_expression) | ('/'^ additive_expression) | ('%'^ additive_expression) )*
;

 additive_expression
: multiplicative_expression (('+'^ multiplicative_expression) | ('-'^ multiplicative_expression))*
;

これを修正する解決策はありますか?

別の質問ですが、AST を構築するときに特別なトークンを追加する方法はありますか? たとえば、次のようなものです。

A B C -> ^( "VAR" B C)

VAR は、AST でのみ確認できる新しいトークンです。

また、「nil」トークンの名前を別のものに変更することは可能ですか?

4

3 に答える 3

1

私は決して ANTLR の専門家ではありませんが、これはあなたが探していることを行うべきではありませんか?

multiplicative_expression
: primary_expression (('*'^|'/'^|'%'^) multiplicative_expression)*
;

 additive_expression
: multiplicative_expression (('+'^|'-'^) multiplicative_expression)*
;

編集:それがうまくいったことを嬉しく思います。Daniel Fischer の結合性に関する指摘に対して、頭に浮かぶ解決策は次のとおりです。

multiplicative_expression
: primary_expression |
  (multiplicative_expression ('*'^|'/'^|'%'^) primary_expression)
;

 additive_expression
: multiplicative_expression |
  (additive_expression ('+'^|'-'^) multiplicative_expression)
;

しかし、ある時点でANTLRがそのような左再帰に対処できなかったと読んだことを思い出したようです。うまくいかない場合はお知らせください。

于 2013-03-09T15:22:06.017 に答える
0

新しいトークンを追加するための解決策を見つけました。これを行うには、これを最初に置きます。

 tokens {
     VAR;
 }

そして、私はそれを使うことができました。

于 2013-03-09T16:28:45.723 に答える
0

C の正しい文法はたくさんありますが、そのうちの 1 つを使用してみませんか? または、少なくともそこから始めますか?

于 2013-03-09T17:14:26.330 に答える