compiler-construction - 重写 ANTLR PrimaryExprList 中的规则 (OR^ PrimaryExprList)*

标签 compiler-construction antlr

有人可以帮我吗,我陷入了困境:

primaryExprList ('|'^ primaryExprList)*

我想用它来代替“|”使用 bool 值

沃伊斯拉夫·斯托伊科维奇的评论:

我已经尝试过了,但是当我使用 a|b|c 时它无法正常工作,应该是这样的

    BOOLEANOR
      |        \
BOOLEANOR        c
|      |
a      b

你的灵魂是这样的:

       BOOLEANOR
   /       |      \
  a        b       c

这是不正确的。

最佳答案

我真的不认为有必要。如果您定义 BOOLEANOR 标记(词法分析器规则):

parse     : primaryExprList ('|'^ primaryExprList)*;
// or:      primaryExprList (BOOLEANOR^ primaryExprList)*

BOOLEANOR : '|';

那么根的类型为BOOLEANOR,其内部文本为"|"

但是,要回答您的问题(或提出解决方案),真正更改根的方法是使用如下重写规则:

grammar T;

options {
  output=AST;
}

tokens {
  OTHER;
}

parse
 : expr EOF!
 ;

expr
 : (e1=primaryExprList -> $e1) ('|' e2=primaryExprList -> ^(OTHER $expr $e2))*
 ;

// other rules

它将把输入:“a|b|c”解析为以下 AST:

enter image description here

关于compiler-construction - 重写 ANTLR PrimaryExprList 中的规则 (OR^ PrimaryExprList)*,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9536571/

相关文章:

c++ - 如何确保我的代码是 ansi C,不涉及 C++。是否可以设置像gcc这样的编译器在遇到C++的特性时提示错误?

java - 我可以从生成的代码中删除 ANTLR 依赖项吗?

parsing - 行为奇怪的 ANTLR 语法

在 ANTLR 中使用正确的 CSS 解析约定解析 CSS 2.1

C++将int转换为字符串?

c++ - 在 MacOS 中编译 C++ 代码时的 dSYM 目录

c++ - 分支? : operator?

scala - 从 Antlr 生成 Scala 代码

antlr - ANTLR4 中的语义谓词?

c - 结构的编译定义在 C 中是什么样子的?