Отсутствует переменная в парсере 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

В нем говорится, что переменная s типа StrEntry отсутствует, но я определил ее в моем файле грамматики. Я не думаю, что редактирование его в файле MicroParser.java - хорошая идея, поскольку он был создан Antlr4.

Что я должен делать?

Вы проверили, что созданный вами синтаксический анализатор содержит код для вашего класса StrEntry. Это кажется чистой проблемой Java, когда компилятор Java не находит символ, поскольку он не известен в момент первого использования.

Mike Lischke 15.09.2018 12:41
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
1
153
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
$s = new StrEntry(); s.addID($id.text); s.addValue($ex.text)

Здесь вы используете как $s (который будет преобразован в _localctx.s в сгенерированном коде Java), так и s (который останется просто s). Последний - это символ, который компилятор не может найти, потому что в этом блоке нет переменной с таким именем.

Другими словами, вам просто нужно постоянно использовать $s вместо s, и он будет работать нормально.

Другие вопросы по теме