2016-10-27 9 views
0

ANTLRで論理演算子と括弧を一緒に含む式を表す文法を定義します。ここ
文法ANTLR文法でかっこを含む論理演算子を定義する方法

grammar simpleGrammar; 

/* This will be the entry point of the parser. */ 

parse 
    : 
     expression EOF 
    ; 
expression 
    : 
     expression binOp expression | ID | unOp (expression) | '(' expression ')' 
    ; 
binOp 
    : 
     ('AND' | 'OR') 
    ; 
unOp 
    : 
     'NOT' 
    ; 
ID  : 
     ('a'..'z' | 'A'..'Z')+ 
    ; 

定義された文法括弧なしで解析木を表現することができますことができるが、私は、入力、例えば括弧付き例を、(Apple OR Bananana)AND Orange それはMismatchedTokenException
そこで表示されている場合、それはなり括弧を表現するために文法を定義する方法を説明してくれて本当に感謝しています。

答えて

1

ANTLRに空白と何をするのか忘れてしまいました。例:

WS : [ \t\r\n] -> skip; 

これを追加すると、文法が有効になります。

ANDORの演算子については、文法の優先順位が同じです。そして、これらの演算子はNOTより高い優先順位を持ちます。これは、従来のルールに反するとして、私の代わりにこのようなあなたのexpressionルールを記述するためにあなたをお勧めする:

expression 
    : '(' expression ')'   # parenExp 
    | 'NOT' expression    # notExpr 
    | expression 'AND' expression # andExpr 
    | expression 'OR' expression # orExpr 
    | ID       # atomExpr 
    ; 
それは再帰 `式「AND」expression`と`表現相互左は「OR」以来
+0

その例外を示し式 ' –

+0

いいえ、直接左回帰式です。 ANTLR4はこれらを処理できますが、ANTLR3はそうではありません。元の質問には直接左回帰も含まれているので、あなたはv4を使っていると思います。 –