9

私はANTLR(3.2)を使用して、かなり単純な文法を解析しています。残念ながら、私は少し問題に遭遇しました。次のルールを取ります。

exp
 : NUM
 | '(' expression OPERATOR expression ')' -> expression+
 | '(' (MINUS | '!') expression ')' -> expression
 ;

OPERATORには、MINUSで定義されているものと同じマイナス記号('-')が含まれています。現在、ANTLRはこれら2つのルールを処理できないようです。どちらかを削除すると、すべて正常に動作します。

誰かアイデア?

4

1 に答える 1

10

単項式を最も優先度の高い式にします。-また、マイナスの区別を明確にするために、単項に別のトークンを使用します。デモ:

grammar Exp;

options { 
  output=AST;
}

tokens {
  UNARY;
}

parse
  :  exp EOF
  ;

exp
  :  additionExp
  ;

additionExp
  :  multiplyExp ('+'^ multiplyExp | '-'^ multiplyExp)*
  ;

multiplyExp
  :  unaryExp ('*'^ unaryExp | '/'^ unaryExp)* 
  ;

unaryExp
  :  '-' atom -> ^(UNARY atom)
  |  '!' atom -> ^('!' atom)
  |  atom
  ;

atom
  :  '(' exp ')' -> exp
  |  Number      -> Number
  ;

Number : ('0'..'9')+ ('.' ('0'..'9')+)? ;

Spaces : (' ' | '\t' | '\r'| '\n') {$channel=HIDDEN;} ;

ソースを使用した簡単なテスト:

3 * -4 + 7 / 6 * -(3 + -7 * (4 + !2))

次のASTを生成しました。

代替テキスト

于 2010-10-26T07:17:50.763 に答える