ANTLR-语义谓词与LL(1)
我想在ANTLR中制作一个LL(1)语法,它允许多重分配,如: x=y=5 我认为语义谓词在这种情况下是有用的,但以下规则不起作用:( ANTLRWORKS给出了一个全新的例外 你知道我做错了什么,怎么做吗? 谢谢!带有语法(而非语义)谓词的语法可以向前看2个标记,当然不是LL(1) 但是,您不需要谓词,只需执行以下操作:ANTLR-语义谓词与LL(1),antlr,antlr3,Antlr,Antlr3,我想在ANTLR中制作一个LL(1)语法,它允许多重分配,如: x=y=5 我认为语义谓词在这种情况下是有用的,但以下规则不起作用:( ANTLRWORKS给出了一个全新的例外 你知道我做错了什么,怎么做吗? 谢谢!带有语法(而非语义)谓词的语法可以向前看2个标记,当然不是LL(1) 但是,您不需要谓词,只需执行以下操作: grammar T; options { output=AST; } tokens { BECOMES = '='; } assignment_statemen
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的调试器。当然,带有向前看2个标记的语法(而非语义)谓词不是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;”
另外,AntlWorks的解释器不能处理任何类型的谓词:请改用AntlWorks的调试器。我想确保x=2=3;之类的事情不会发生。但现在您的解决方案可以工作了!:)谢谢@用户1255553,我没说是。您仍然不需要谓词。但为什么会有LL(1)要求?ANTLR毕竟是一个LL(*)解析器生成器;不可能发生。但现在对你来说,你的解决方案是有效的!:)谢谢大家!@用户1255553,我没说是。您仍然不需要谓词。但为什么会有LL(1)要求?ANTLR毕竟是一个LL(*)解析器生成器。