Как реализовать включение файлов в ANTLR? - PullRequest
0 голосов
/ 24 мая 2019

Я использую 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());
...