Отсутствует переменная в парсере Antlr4 - PullRequest
0 голосов
/ 14 сентября 2018

Я пытаюсь создать таблицу символов для языка, использующего 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.

Что мне делать?

1 Ответ

0 голосов
/ 15 сентября 2018
$s = new StrEntry(); s.addID($id.text); s.addValue($ex.text)

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

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

...