Я пытаюсь создать таблицу символов для языка с использованием 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
В нем говорится, что переменная s типа StrEntry отсутствует, но я определил ее в моем файле грамматики. Я не думаю, что редактирование его в файле MicroParser.java - хорошая идея, поскольку он был создан Antlr4.
Что я должен делать?
$s = new StrEntry(); s.addID($id.text); s.addValue($ex.text)
Здесь вы используете как $s
(который будет преобразован в _localctx.s
в сгенерированном коде Java), так и s
(который останется просто s
). Последний - это символ, который компилятор не может найти, потому что в этом блоке нет переменной с таким именем.
Другими словами, вам просто нужно постоянно использовать $s
вместо s
, и он будет работать нормально.
Вы проверили, что созданный вами синтаксический анализатор содержит код для вашего класса StrEntry. Это кажется чистой проблемой Java, когда компилятор Java не находит символ, поскольку он не известен в момент первого использования.