java - 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 类型的变量,但我已经在语法文件中定义了它。我认为在 MicroParser.java 文件中编辑它不是一个好主意,因为它是由 Antlr4 生成的。

我该怎么办?

最佳答案

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

这里您使用了 $s (在生成的 Java 代码中将被转换为 _localctx.s)和 s (这将仍然只是 s)。后者是编译器无法找到的符号,因为该 block 中没有定义具有该名称的变量。

换句话说,您只需要始终使用 $s 而不是 s 即可正常工作。

关于java - Antlr4 解析器中缺少变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52337144/

相关文章:

java - 如何创建一个新项目来获取 IntelliJ 中另一个项目的编译输出?

antlr4 - Natty 从 anlr3 转换为 antlr 4

c# - 将 LeftBracket 之后的所有内容解释为字符串,直到下一个 RightBracket

实现 Serializable 接口(interface)的 Java 类

java - 从Java中的内部类访问外部类 "super"

antlr4 - 输入 ANTLR4 没有可行的替代方案?

java - ANTLR4语法无法涵盖所有​​情况

parsing - ANTLR4:导入和 tokenVocab 之间有什么区别吗?

java - 使用线程安全集合的多线程

java - 2 java.util.Date 之间的月数,不包括月中的第几天