Antlr4解析器中缺少变量

时间:2018-09-14 18:01:43

标签: java antlr4

我正在尝试使用Antlr4为一种语言构建符号表。我的语法文件中有以下规则。

<div class="toggle">
  <div class="left-border"></div>
</div>

我还创建了StrEntry类(虚拟实现)

/* Global String Declaration */
//string_decl       : STRING id ASSIGN str SEMICOLON ;
string_decl returns [StrEntry s] : STRING id ASSIGN ex=str SEMICOLON 
           { $s = new StrEntry(); s.addID($id.text); s.addValue($ex.text);} ;

编译(public class StrEntry{ String value; String id; String type; void addID(String x){ id = x; } void addValue(String c){ value = c; } } )时出现以下错误:

javac *.java

它说缺少StrEntry类型的变量s,但是我已经在我的语法文件中定义了它。我认为在MicroParser.java文件中对其进行编辑不是一个好主意,因为它是由Antlr4生成的。

我该怎么办?

1 个答案:

答案 0 :(得分:1)

$s = new StrEntry(); s.addID($id.text); s.addValue($ex.text)

此处您同时使用$s(将在生成的Java代码中转换为_localctx.s)和s(仅保留s)两者。后者是编译器找不到的符号,因为在该块中没有定义该名称的变量。

换句话说,您只需要持续使用$s而不是s,就可以正常工作。