java - 扩展 token 选择运算符

标签 java antlr antlr3 lexer

我在 ANTLR3 中有一个表达式

num_addition
    : num_multi ((plus^|minus^) num_multi)*
    ;

我想将标记“加”和“减”更改为不同的标记,因此我尝试制定此重写规则。

num_addition
    : num_multi (plus num_multi)* -> ^(num_multi ^(plus_special num_multi)*)
    | num_multi (minus num_multi)* -> ^(num_multi ^(minus_special num_multi)*)
    ;

如果我这样做,ANTLRWORKS 中的生成似乎需要更长的时间,但它生成了正确的语法和标记。如果我将此样式应用于其他规则,例如“multi”、“divide”和“equalequal”等,那么最终会导致当我按下“Generate”时 ANTLRWORKS 不会执行任何操作。

根据 ANTLRWORKS 没有错误,但当我预生成时什么也没有发生。

我是否错误地重写了我想要实现的目标?

最佳答案

您不能将任何与您为其创建 AST 的解析器规则不匹配的产生式或终端注入(inject)到 AST 中。在您的情况下,您可以插入 plusminus 因为它们与解析器规则匹配,但不能插入 plus_specialminus_special 因为这些与解析器规则 num_addition 不匹配。

不过,您可以注入(inject)虚构的 token 。

尝试这样的事情:

grammar T;

tokens {
  // Some imaginary tokens:
  PLUS_SPECIAL;
  MINUS_SPECIAL;
}

// ...

num_addition
 : (a=num_multi -> $a) ( PLUS  b=num_multi -> ^(PLUS_SPECIAL  $num_addition $b)
                       | MINUS b=num_multi -> ^(MINUS_SPECIAL $num_addition $b)
                       )*
 ;

// ...

PLUS : '+';
MINUS : '-';

关于java - 扩展 token 选择运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22212518/

相关文章:

java - 将 hibernate3 与现有表一起使用

c - "FOLLOW_set_in_"... 在生成的解析器中未定义

java - 如何在antlr中同时使用单引号字符串和双引号single?

java - 在 Java 中为我自己的语言语法生成解析器的最佳工具是什么?

c - 在 C 目标中用 antlr3 解析一些特定的语句

在 C 中编译 ANTLR 3 语法

java - Hibernate 对四个表的查询

java - 如何扩展Java的SWT标签?

java - 无法在Eclipse中使用Java访问hbase

parsing - 什么时候使用诸如 ANTLR 之类的解析器比编写自己的解析代码更好?