11

ANTLRでは演算子の優先順位はどのように実装されていますか?

現在、XText/Antlrパッケージを使用しています。

編集:

sepp2kが提案したことを実行し、演算子の優先順位が機能するようになりましたが、3+*のようなものも機能するようになりました。オペレーターは基本的にツリーを「通り抜け」ます。

また、ANTLRのウェブサイトでC文法を試しましたが、ANTLRworksでも同じことが起こりました。

誰もが問題が何であるか知っていますか?

BinaryExpression:
  'or'? AndOp; //or op

AndOp:
  'and'? ComparisonOp;

ComparisonOp:
  ('>'|'<'|'>='|'<='|'=='|'~=')? ConcatOp;

ConcatOp:
  '..'? AddSubOp;

AddSubOp:
  ('+' | '-')? MultDivOp;

MultDivOp:
  ('*' | '/')? ExpOp;

ExpOp:
  '^'? expr=Expression;
4

2 に答える 2

15

Xtext / ANTLR 3では、次のように文法規則の優先順位をエンコードします。

Expr:  mult ('+' mult)* ;
Mult:  atom ('*' atom)* ;
Atom:  INT | '(' expr ')' ;

これにより、「1 + 2 * 3 +(4 * 5 + 6)」が「(1 +(2 * 3))+((4 * 5)+ 6)」として解析されます。

于 2009-09-20T19:18:37.637 に答える
3

Xtextを使用しているので、Xtextのアクションコンセプトを使用することをお勧めします。つまり、単純な式の文法は通常、次のようになります。

Sum: Product ({Sum.left=current} operator=('+'|'-') right=Product)*;
Product: Atom ({Product.left=current} operator=('+'|'-') right=Atom)*;
Atom: Number | Paren;
Paren: '(' Sum ')';
Number: value=INT;

詳細については、ドキュメントをご覧ください。

于 2011-04-26T20:13:37.730 に答える