我正在尝试使用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生成的。
我该怎么办?
答案 0 :(得分:1)
$s = new StrEntry(); s.addID($id.text); s.addValue($ex.text)
此处您同时使用$s
(将在生成的Java代码中转换为_localctx.s
)和s
(仅保留s
)两者。后者是编译器找不到的符号,因为在该块中没有定义该名称的变量。
换句话说,您只需要持续使用$s
而不是s
,就可以正常工作。