1

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

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

4

1 回答 1

1

当然,具有向前看 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 的调试器。

于 2012-06-06T18:35:05.340 回答