Я использую ANTLR4, чтобы попытаться реализовать язык, поддерживающий включаемые файлы, такие как PHP include
.
var a = 4 + 5; // line a
include "some.inc"; // include statement
var b = 9 * 9; // line b
Содержимое some.inc :
a *= 2;
a +== 3; // Typo here (extranous equals sign)
Мне нужно разобрать дерево так, чтобы содержимое some.inc было вставлено в расположение оператора include
.
Как мне это сделать в ANTLR4?
Я мог бы, конечно, построить новую строку и выполнить некоторую конкатенацию (например, lineA + getContentsOf("some.inc") + lineB
) и , а затем передать ее лексеру, но я боюсь, что номера строк и столбцов испортятся поэтому я бы предпочел сохранить исходный путь, строку и столбец.
Редактировать: Я хочу предупредить автора кода на целевом языке, если он допустил ошибку в своем коде. В приведенном выше примере автор сделал опечатку. Я хочу предупредить пользователя об ошибке в строке 2 some.inc . Если разрешения включаются (то есть заменяются) до , то весь ввод передается лексеру, тогда поток ввода будет выглядеть следующим образом:
var a = 4 + 5; // line a
a *= 2;
a +== 3; // Typo here (extranous equals sign)
var b = 9 * 9; // line b
Синтаксический анализатор не будет знать, что искаженное выражение a +== 3
изначально пришло из строки 2 some.inc, сообщая, таким образом, о неправильной позиции.
Мой текущий код выглядит так:
CharStream cs = CharStreams.fromPath(mySourceCode);
MyLexer lexer = new MyLexer(cs);
CommonTokenStream tokenStream = new CommonTokenStream(lexer);
MyParser parser = new MyParser(tokenStream);
System.out.println(parser.startRule());