1

私はANTLRで次のような再帰式を解析しようとしています:

(a + (b + C))

また

((a + b))

私はこの想定される解決策を読みました: 式のためのANTLR文法

ただし、次のようなルールを作成しようとすると、次のようになります。

ParenthesisExpression: '(' (ParenthesisExpression | Expression) ')';

ANTLRは、「RuleParenthesisExpressionは左再帰的です」と文句を言います。

同じ形式の部分式を自分自身の中に持つことができる式をどのように解析できますか?

4

1 に答える 1

4

あなたはこのようなことをすることができます:

parse
  :  addExp EOF
  ;

addExp
  :  multExp (('+' | '-') multExp)*
  ;

multExp
  :  atom (('*' | '/') atom)*
  ;

atom
  :  ID
  |  '(' addExp ')'
  ;

ID    : 'a'..'z' | 'A'..'Z';

atomルールに近づくほど、優先順位が高くなります。つまり、優先順位が最も低く、次に+andが続き、最後に、優先順位が最も高くなります。-*/ID( ... )


入力を解析します。

((a / b)) - x

次のように:

ここに画像の説明を入力してください


および入力:

(a * (b + C))

次のように解析されます:

ここに画像の説明を入力してください

于 2011-04-07T05:27:44.340 に答える