Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何从antlr v2转换为v3语法?_Java_Antlr3_Antlr2 - Fatal编程技术网

Java 如何从antlr v2转换为v3语法?

Java 如何从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

我在ANTLR的v2中有下面的语法,我需要帮助将其转换为v3

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中树木的所有信息都可以在此处找到: