Java 如何从antlr v2转换为v3语法?
我在ANTLR的v2中有下面的语法,我需要帮助将其转换为v3Java 如何从antlr v2转换为v3语法?,java,antlr3,antlr2,Java,Antlr3,Antlr2,我在ANTLR的v2中有下面的语法,我需要帮助将其转换为v3 expression : ( simpleLookup | lookup ) ( x:LSQRBRACKET^ {#x.setType(ATTRIBUTES);} attributesExpr RSQRBRACKET! )? ;enter code here 实际上,我在下面进行了尝试,但不确定它是否相同,并且在尝试构建解析器时也出现了下面的错误 expression : ( simpleLookup | looku
expression
: ( simpleLookup
| lookup
)
( x:LSQRBRACKET^ {#x.setType(ATTRIBUTES);} attributesExpr RSQRBRACKET! )?
;enter code here
实际上,我在下面进行了尝试,但不确定它是否相同,并且在尝试构建解析器时也出现了下面的错误
expression
: ( simpleLookup
| lookup
)
(x=LSQRBRACKET b=attributesExpr RSQRBRACKET )?) -> ^(ATTRIBUTES[$x] $a $b)?
;
并且在误差以下
expecting SEMI, found '->'
unexpected token: $
unexpected token: $
unexpected token: )
如何从v2转换v3中的“!”?
请用你的专业知识帮助我
我还有一个问题是,如何在v3中编写语法级别的树解析器,就像我们以前在v2中使用的格式一样
class CustomTreeParser extends TreeParser;
试着这样做:
grammar YourGrammarName;
options {
output=AST;
}
tokens {
ATTRIBUTES;
}
// ...
expression
: ( simpleLookup
| lookup
)
( x=LSQRBRACKET^ {$x.setType(ATTRIBUTES);} attributesExpr RSQRBRACKET! )?
;
// ...
如何将v3中的“!”从v2转换为
内联代码>运算符(从AST中排除某些规则/令牌)在v3中保持不变
我还有一个问题是如何在v3中编写语法级别的树解析器,如v2
像这样:
options {
output=AST;
}
实际上,如果我按照你的建议去做的话,上面说我同时使用了重写和运算器规则,但是如果我删除了“!”然后没关系,但是RSQRBRACKET也被添加到树中,我不想要。现在对于我在一些研究后提出的另一个问题,我发现我必须为树语法创建单独的语法文件,我需要在顶部有“tree grammar[语法文件名]”,然后它自动创建一个扩展TreeParser的类文件,或者它会创建一个扩展解析器的程序。关于你的第一条评论:那么你没有按照我的建议去做。规则表达式
无法给出同时使用重写和运算符规则的错误,因为不再存在重写运算符->
。关于你的第二条评论:第一步是创建一个生成AST的解析器(这就是我认为你的意思)。我的回答是可以做到的。创建AST后,您可以创建一个遍历此AST的树遍历器,并在AST的节点上执行操作。这样的树漫游器可以由树语法生成。有关ANTLRv3中树木的所有信息都可以在此处找到: