ANTLR - 语义谓词和LL(1)

时间:2012-06-06 18:09:59

标签: antlr antlr3

我想在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。

你知道我做错了什么以及如何使这项工作? 谢谢!

1 个答案:

答案 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;",如下所示:

enter image description here

但会拒绝"x=2=3;"之类的输入。

此外,ANTLRWorks的解释器不适用于任何类型的谓词:使用ANTLRWorks的调试器。