【发布时间】:2014-04-10 03:02:20
【问题描述】:
我在 ANTLR 中为类似 Java 的 if 语句编写了一个语法如下:
if_statement
: 'if' expression
(statement | '{' statement+ '}')
('elif' expression (statement | '{' statement+ '}'))*
('else' (statement | '{' statement+ '}'))?
;
我已经正确实现了“语句”和“表达式”,但是 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)*
;
【问题讨论】:
标签: parsing programming-languages antlr grammar lexical-analysis