ANTLR-语义谓词与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

我想在ANTLR中制作一个LL(1)语法,它允许多重分配,如: x=y=5

我认为语义谓词在这种情况下是有用的,但以下规则不起作用:(

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;”

此外,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(*)解析器生成器。