私は簡単なプログラミング言語のANTLR文法を作成しようとしています。ANTLR if-else ambiguity errors
文場合、それはC-等を有している:
program
: statement* EOF
;
statement
: block # blockStatement
| SEMI # emptyStatement
| assignment # assignmentStatement
| declaration # variableDeclarationStatement
| 'if' parExpression ifBody=statement ('else' elseBody=statement)? # ifStatement
..........
;
block
: '{' statement* '}'
;
expression
: literal # literalExpression
| Identifier # variableReference
..........
;
parExpression : '(' expression ')';
assignment : Identifier assignmentOp expression SEMI;
SEMI : ';';
Identifier : (LETTER | '_') (LETTER | DIGIT | '_')* ;
正常に動作するようですが、私はDiagnosticErrorListener
を実行したとき、私はこの
if (flag1)
x = 42;
else if (flag2)
x = 43;
else
x = 44;
ようなコードのためのエラー
reportAttemptingFullContext d=1 (statement), input='else', Line 3:0
reportContextSensitivity d=1 (statement), input='else', Line 3:0
reportAttemptingFullContext d=1 (statement), input='else', Line 5:0
reportContextSensitivity d=1 (statement), input='else', Line 5:0
を取得
ここで何が間違っているのか分かりませんが、 if (a) if (b) ... else ...
)、この文法はあいまいである可能性があります。
どのように修正する必要がありますか?
なぜJavaタグですか? – GhostCat
私はあなたが気にする必要はないと信じています。ここで報告されるのは、パーザがそれ自体であいまいさを解決しようとしたものです。通常の解析実行で期待通りの結果が得られた場合、文法はうまくいくようです。 –