Compiler construction 在ANTLR primaryExprList(或^primaryExprList)中重写规则*

Compiler construction 在ANTLR primaryExprList(或^primaryExprList)中重写规则*,compiler-construction,antlr,Compiler Construction,Antlr,有人能帮帮我吗,我陷入了困境: primaryExprList ('|'^ primaryExprList)* 我想用BOOLEANOR来代替“|” 对沃伊斯拉夫·斯托伊科维奇的评论: 我已经试过了,但当我使用a | b | c时,它不会正常工作。应该是这样的 BOOLEANOR | \ BOOLEANOR c | | a b 你的灵魂是这样的: BOOLEANOR / | \

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

primaryExprList ('|'^ primaryExprList)*
我想用BOOLEANOR来代替“|”

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

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

    BOOLEANOR
      |        \
BOOLEANOR        c
|      |
a      b
你的灵魂是这样的:

       BOOLEANOR
   /       |      \
  a        b       c
grammar T;

options {
  output=AST;
}

tokens {
  OTHER;
}

parse
 : expr EOF!
 ;

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

// other rules
哪个是不正确的。

这有帮助吗

primaryExprList ('|' primaryExprList)* -> ^(BOOLEANOR primaryExprList+)

还是我误解了你的问题?

我真的觉得没有必要。如果定义
布尔型或
标记(lexer规则):

然后,根的类型为
BOOLEANOR
,其内部文本为
“|”

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

       BOOLEANOR
   /       |      \
  a        b       c
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:


再次检查我的问题,这里有一条评论供你参考。由于声誉限制,我无法发布答案,在评论中我也无法写下这棵树