Antlr4 解析器中缺少变量

  • 本文关键字:变量 Antlr4 java antlr4
  • 更新时间 :
  • 英文 :


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

/* 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);} ;

我还创建了一个 StrEntry 类(一个虚拟实现(。

public class StrEntry{

String value;
String id;
String type;

void addID(String x){
id = x;
}
void addValue(String c){
value = c;
}
}

当我编译(javac *.java(时,出现以下错误:

MicroParser.java:382: error: cannot find symbol
((String_declContext)_localctx).s =  new   StrEntry(); s.addID((((String_declContext)_localctx).id!=null?  _input.getText(((String_declContext)_localctx).id.start,    ((String_declContext)_localctx).id.stop):null));    s.addValue((((String_declContext)_localctx).ex!=null?_input.getText(((String_declContext)_localctx).ex.start,   ((String_declContext)_localctx).ex.stop):null));
                                                                                                                                                                  ^
symbol:   variable s
location: class MicroParser

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

我该怎么办?

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

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

换句话说,您只需要始终如一地使用$s而不是s它就可以正常工作。

相关内容

  • 没有找到相关文章

最新更新