[英]Context Free Grammar in ANTLR throwing error for if-statement
我在ANTLR中為類似Java的if語句編寫了一個語法,如下所示:
if_statement
: 'if' expression
(statement | '{' statement+ '}')
('elif' expression (statement | '{' statement+ '}'))*
('else' (statement | '{' statement+ '}'))?
;
我已經正確實現了“ statement”和“ expression”,但是if_statement給了我以下錯誤:
Decision can match input such as "'elif'" using multiple alternatives: 1, 2
As a result, alternative(s) 2 were disabled for that input
|---> ('elif' expression (statement | '{' statement+ '}'))*
warning(200): /OptDB/src/OptDB/XL.g:38:9:
Decision can match input such as "'else'" using multiple alternatives: 1, 2
As a result, alternative(s) 2 were disabled for that input
|---> ('else' (statement | '{' statement+ '}'))?
似乎“ elif”和“ else”塊存在問題。 基本上,我們可以有0個或更多的“ elif”塊,所以我用*包裹了它們。我們也可以有0或1個“ else”塊,所以我用?包裹了它。
似乎是什么引起了錯誤?
================================================== ======================
我還將介紹“表達式”和“語句”的實現:
statement
: assignment_statement
| if_statement
| while_statement
| for_statement
| function_call_statement
;
term
: IDENTIFIER
| '(' expression ')'
| INTEGER
| STRING_LITERAL
| CHAR_LITERAL
| IDENTIFIER '(' actualParameters ')'
;
negation
: 'not'* term
;
unary
: ('+' | '-')* negation
;
mult
: unary (('*' | '/' | 'mod') unary)*
;
add
: mult (('+' | '-') mult)*
;
relation
: add (('=' | '/=' | '<' | '<=' | '>=' | '>') add)*
;
expression
: relation (('and' | 'or') relation)*
;
actualParameters
: expression (',' expression)*
;
因為您的語法允許語句塊而不用{...}
進行分組,所以您將獲得經典的懸掛式模糊性。
簡短說明。 輸入:
if expr1 if expr2 ... else ...
可以解析為:
if expr1
if expr2
...
else
...
而且也這樣:
if expr1
if expr2
...
else
...
為了消除歧義,請更改以下任一方法:
(statement | '{' statement+ '}')
成:
'{' statement+ '}'
// or
'{' statement* '}'
通過查看if
屬於else
的花括號可以很清楚地看到,或者添加一個謂詞以強制解析器選擇Parse 1 :
if_statement
: 'if' expression statement_block
(('elif')=> 'elif' expression statement_block)*
(('else')=> 'else' statement_block)?
;
statement_block
: '{' statement* '}'
| statement
;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.