2016-05-17 10 views
0

私のANTLR v4の文法の抜粋は次のようになります。好む一つの代替

expression: 
    | expression BINARY_OPERATOR expression 
    | unaryExpression 
    | nularExpression 
; 
unaryExpression: 
    ID expression 
; 

nularExpression: 
    ID 
    | NUMBER 
    | STRING 
; 

私の目標は、すべての必要なキーワードを知っているので、私は単純にIDとしてのキーワードに一致していなくて言語を一致させることです。
しかし、キーワード(キーワードなど)の両側に引数をとるバイナリ演算子があるため、「特別扱い」が必要です。ご覧のとおり、私はすでにこの特別扱いをexpressionルールに含めました。

実際の問題は、これらのバイナリ演算子のいくつかが単項演算子(=通常のキーワード)としても使用できるという事実から成り立っており、左の引数を指定する必要はありません。
これを実装しようと試みるたびに、すべてのバイナリ演算子が単項演算子として消費されるため、上記の文法はこのケースを混乱させることはありません。

例:
のはcountがバイナリ演算子であると仮定しましょう。
可能な構文は、上記のケースを実装するための<arg1> count <arg2>count <arg>

すべての私の試みは(myArgument (count (otherArgument)))代わりの(myArgument) count (otherArgument)


この問題を解決するには、パーサーを伝えることであると私の脳tellsmeようをグループ化してしまっていますバイナリ演算子には常に2つの引数を取ることになり、失敗した場合はバイナリ演算子を単項演算子として消費しようとします。
誰でもこれを達成する方法を知っていますか?

答えて

0

どのようにこのようなものについて:

lower_precedence_expression 
: ID higher_precedence_expression 
| higher_precedence_expression 
; 

higher_precedence_expression 
: higher_precedence_expression ID lower_precedence_expression 
| ID 
| NUMBER 
| STRING 
;