Как создать шаблон и класс Worker для правила парсера antlr, которое имеет более одной возможности? - PullRequest
0 голосов
/ 23 марта 2020

Я пытаюсь создать компилятор для получения ввода от моего языка Poggle (созданного с помощью Antlr) для ввода пользовательского ввода, например print ("Hello"); и компиляции в javascript с использованием библиотеки шаблонов String. Мне трудно отличить, является ли это оператором print или оператором if из команды правила синтаксического анализатора - как показано ниже.

command
: 'print' string_operation SEMICOLON
| ifstmt
;
ifstmt : 'if' if_condition_block;
if_condition_block : expression block;

Ниже приведен мой код для моей функции, которая переопределяет класс baseVisitor:

package Compiler;

import org.antlr.v4.runtime.tree.ParseTree;
import org.stringtemplate.v4.ST;
import org.stringtemplate.v4.STGroup;
import org.stringtemplate.v4.STGroupFile;

public class Worker extends PoggleBaseVisitor<ST> {
    private static final STGroup group = new STGroupFile("JavaScript.stg");

    @Override
    public ST visitPrgm(PoggleParser.PrgmContext ctx)
    {
        ST mainProgram = group.getInstanceOf("program");
        int n = ctx.getChildCount();
        for(int i = 0; i < n; ++i)
        {
            ParseTree c = ctx.getChild(i);
            mainProgram.add("statement", c.accept(this));
        }
        return mainProgram;
    }

    @Override
    public ST visitCommand(PoggleParser.CommandContext ctx)
    {
        ST st = group.getInstanceOf("print");
        st.add("expr", ctx.string_operation());
        return st;
    }
}

Ниже показан мой файл .stg, в котором содержатся шаблоны для кода:

program(statement) ::= "<statement; separator=\"\n\">"
command() ::=

Я не уверен, что поместить для шаблона команды в файл .stg из-за утверждение print и if отличается, и я не уверен, как получить к нему доступ в моем классе Worker, как показано выше.

...