如何将此Antlr3 AST转换为Antlr4?

如何将此Antlr3 AST转换为Antlr4?,antlr,antlr4,antlr3,Antlr,Antlr4,Antlr3,我正在尝试将现有的Antlr3项目转换为Antlr4,以获得更多功能。我有一个不会用Antlr4.9编译的语法 expr : term ( OR^ term )* ; 及 主要是因为Antlr4不支持^和不再。从文件上看,这些似乎是 AST根运算符。生成抽象语法树(AST)时,标记 后缀为“^”根运算符的引用强制将AST节点 创建并添加为当前树的根。此符号仅适用于 设置buildAST选项时生效。有关AST的更多信息 也有 AST排除运算符。生成抽象语法树时,标记 后缀

我正在尝试将现有的Antlr3项目转换为Antlr4,以获得更多功能。我有一个不会用Antlr4.9编译的语法

expr        
    : term ( OR^ term )* ;

主要是因为Antlr4不支持
^
不再。从文件上看,这些似乎是

AST根运算符。生成抽象语法树(AST)时,标记 后缀为“^”根运算符的引用强制将AST节点 创建并添加为当前树的根。此符号仅适用于 设置buildAST选项时生效。有关AST的更多信息 也有

AST排除运算符。生成抽象语法树时,标记 后缀为“!”排除运算符的引用不包括在 AST是为该规则构造的。规则引用也可以是 后缀为exclude运算符,这意味着 由于已构造引用的规则,因此它不会链接到树中 对于引用规则。此符号仅在以下情况下有效: 已设置buildAST选项。有关ASTs的更多信息也可供查阅

如果我把它们去掉,它会编译,但我不确定这些是什么意思,以及Antlr4如何支持它

LPAREN
RPAREN
是令牌

tokens {
    EQUALS = '=';
    LPAREN = '(';
    RPAREN = ')';
}
哪个Antlr4提供了在错误消息中转换的方法,而不是
^
。语法用于解析布尔表达式,例如
(a=b和b=c)

我认为这是规则

targetingexpr returns [boolean value]
    : expr { $value = $expr.value; } ;

expr returns [boolean value]
    : ^(NOT a=expr) { $value = !a; }        
    | ^(AND a=expr b=expr) { $value = a && b; }
    | ^(OR a=expr b=expr) { $value = a || b; }
    | ^(EQUALS A=ALPHANUM B=ALPHANUM) { $value = targetingContext.contains($A.text,$B.text); }
    ;
    
targetingexpr returns [boolean value]
    : expr { $value = $expr.value; } ;

expr returns [boolean value]
    : ^(NOT a=expr) { $value = !a; }        
    | ^(AND a=expr b=expr) { $value = a && b; }
    | ^(OR a=expr b=expr) { $value = a || b; }
    | ^(EQUALS A=ALPHANUM B=ALPHANUM) { $value = targetingContext.contains($A.text,$B.text); }
    ;
v3语法:

...

tokens {
    EQUALS = '=';
    LPAREN = '(';
    RPAREN = ')';
}

...

expr        
    : term ( OR^ term )* ;

factor 
    : ava | NOT^ factor | (LPAREN! expr RPAREN!) ;
在v4中,将如下所示:

...

expr        
    : term ( OR term )* ;

factor 
    : ava | NOT factor | (LPAREN expr RPAREN) ;

EQUALS : '=';
LPAREN : '(';
RPAREN : ')';
因此,只需删除内联的
^
操作符(树重写在ANTLR4中不再可用),并将
tokens{…}
部分中的文字标记移动到自己的lexer规则中

我认为这是规则

targetingexpr returns [boolean value]
    : expr { $value = $expr.value; } ;

expr returns [boolean value]
    : ^(NOT a=expr) { $value = !a; }        
    | ^(AND a=expr b=expr) { $value = a && b; }
    | ^(OR a=expr b=expr) { $value = a || b; }
    | ^(EQUALS A=ALPHANUM B=ALPHANUM) { $value = targetingContext.contains($A.text,$B.text); }
    ;
    
targetingexpr returns [boolean value]
    : expr { $value = $expr.value; } ;

expr returns [boolean value]
    : ^(NOT a=expr) { $value = !a; }        
    | ^(AND a=expr b=expr) { $value = a && b; }
    | ^(OR a=expr b=expr) { $value = a || b; }
    | ^(EQUALS A=ALPHANUM B=ALPHANUM) { $value = targetingContext.contains($A.text,$B.text); }
    ;
你在那里发布的内容是树语法的一部分,没有对应的语法。在ANTLR4中,您可以使用访问者来计算表达式,而不是在树语法中进行计算。

v3语法:

...

tokens {
    EQUALS = '=';
    LPAREN = '(';
    RPAREN = ')';
}

...

expr        
    : term ( OR^ term )* ;

factor 
    : ava | NOT^ factor | (LPAREN! expr RPAREN!) ;
在v4中,将如下所示:

...

expr        
    : term ( OR term )* ;

factor 
    : ava | NOT factor | (LPAREN expr RPAREN) ;

EQUALS : '=';
LPAREN : '(';
RPAREN : ')';
因此,只需删除内联的
^
操作符(树重写在ANTLR4中不再可用),并将
tokens{…}
部分中的文字标记移动到自己的lexer规则中

我认为这是规则

targetingexpr returns [boolean value]
    : expr { $value = $expr.value; } ;

expr returns [boolean value]
    : ^(NOT a=expr) { $value = !a; }        
    | ^(AND a=expr b=expr) { $value = a && b; }
    | ^(OR a=expr b=expr) { $value = a || b; }
    | ^(EQUALS A=ALPHANUM B=ALPHANUM) { $value = targetingContext.contains($A.text,$B.text); }
    ;
    
targetingexpr returns [boolean value]
    : expr { $value = $expr.value; } ;

expr returns [boolean value]
    : ^(NOT a=expr) { $value = !a; }        
    | ^(AND a=expr b=expr) { $value = a && b; }
    | ^(OR a=expr b=expr) { $value = a || b; }
    | ^(EQUALS A=ALPHANUM B=ALPHANUM) { $value = targetingContext.contains($A.text,$B.text); }
    ;

你在那里发布的内容是树语法的一部分,没有对应的语法。在ANTLR4中,您可以使用访问者来计算表达式,而不是在树语法中进行计算。

因此,ANTLR4的mo等价于^and!?没有对等的标准。如果需要通过CST的树漫游器构建AST,则需要构建自己的AST。然而,您似乎只是用动作代码合成了一个布尔值,因此不需要使用AST——在CST之外工作!?没有对等的标准。如果需要通过CST的树漫游器构建AST,则需要构建自己的AST。然而,您似乎只是用动作代码合成了一个布尔值,因此不需要AST——使用CST。