我想在ANTLR中创建一个允许多重分配的LL(1)语法,例如: x = y = 5;
我认为语义谓词在这种情况下很有用,但以下规则不起作用:(
tokens {
BECOMES = '='
}
assignment_statement
: IDENTIFIER BECOMES expr
;
expr
: (IDENTIFIER BECOMES)=> IDENTIFIER BECOMES expr
| expr_or
;
IDENTIFIER
: LETTER (LETTER | DIGIT)*
;
ANTLRWORKS提供NoViableAltException。
你知道我做错了什么以及如何使这项工作? 谢谢!
答案 0 :(得分:1)
带有句法(不是语义)谓词的语法,当前看起来不是LL(1)。
但是,您不需要谓词,只需执行以下操作:
grammar T;
options {
output=AST;
}
tokens {
BECOMES = '=';
}
assignment_statement
: (IDENTIFIER BECOMES)+ expr ';'
;
expr
: IDENTIFIER
| NUMBER
;
IDENTIFIER
: LETTER (LETTER | DIGIT)*
;
NUMBER
: DIGIT+
;
fragment LETTER : 'a'..'z' | 'A'..'Z';
fragment DIGIT : '0'..'9';
将解析输入"x=y=5;"
,如下所示:
但会拒绝"x=2=3;"
之类的输入。
此外,ANTLRWorks的解释器不适用于任何类型的谓词:使用ANTLRWorks的调试器。