簡體   English   中英

ANTLR中的上下文自由語法為if語句引發錯誤

[英]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 ...

可以解析為:

解析1

if expr1
    if expr2
        ...
    else
        ...

而且也這樣:

解析2

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM