Как получить объявленные переменные ANTLR - PullRequest
0 голосов
/ 30 марта 2020

У меня есть следующее правило синтаксического анализатора

study: 'study' '(' ( assign* | ( assign (',' assign)*) ) ')' NEWLINE;
assign: ID '=' (INT  | DATA );
INT :   [0-9]+ ;
DATA    : '"' ID '"' | '"' INT '"';
ID  :   [a-zA-Z]+ ;

Моя проблема теперь, как я могу получить переменные, определенные в исследовании в методе entryStudy

@Override
    public void enterStudy(StudyParser.StudyContext ctx) {
        // get the declared variables
       // study(hello = "hello",world = "world")
       // study(hello = "hello",world = "world",name = "name")
        System.out.println("enterStudy");
    }

1 Ответ

0 голосов
/ 30 марта 2020

Добавьте следующий фрагмент к вашей грамматике:

@members {
    public final java.util.List<java.util.Map.Entry<String, String>> parameters = new java.util.ArrayList<>();
}

Измените правило назначения:

assign: name=ID '=' value=(INT  | DATA ) {
    parameters.add(new java.util.AbstractMap.SimpleImmutableEntry($name.text, $value.text));
};

Теперь вы можете использовать поле StudyParser.parameters для доступа к необходимой информации:

StudyParser parser = ...;
parser.study();
System.out.println(parser.parameters);

Также обратите внимание, что ваша грамматика, вероятно, немного ошибочна, поскольку допускает следующий ввод: study(x=1y=2).

...