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