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