Antlr4: вопросы по грамматике-4/javascript для порта C++

Я пытаюсь портировать грамматику-4/javascript грамматику на C++ с подходом, используемым в уже представленных реализациях C# и Java. ( https://github.com/antlr/grammars-v4/tree/master/javascript). Во-первых, позвольте мне объяснить, как реализации C# и Java предоставляют сгенерированный код Lexer и Parser для клиентов. Например, каждая реализация определяет базовый класс для Lexer - JavaScriptBaseClass - с определенными методами NextToken(), RegexPossible() и т.д., который, естественно, унаследован от класса Antlr Lexer. Файл грамматики JavaScriptLexer.g4 определяет JavaScriptBaseLexer как суперкласс для сгенерированного лексера. В то же время некоторые объекты, которые будут доступны только после JavaScriptLexer генерация исходного кода используется внутри определенных методов базового класса JavaScriptBaseClass, Например JavaScriptBaseLexer::NextToken метод использует OpenBrace значение enum, которое описывает один из токенов грамматики. ( https://github.com/antlr/grammars-v4/blob/a2b8cdfae4057f330f1ec46e8b8e87ea3e7ad962/javascript/CSharpSharwell/JavaScriptBaseLexer.cs#L68) это не Java или Java-код. предварительно определить файлы заголовков, а затем включить их в код, где может появиться имя из файла заголовка. Таким образом, можно использовать поля еще не сгенерированного исходного кода JavaScriptLexer класс внутри базового класса.

Но как этого достичь в реализации C++? Во-первых, сгенерированный класс должен знать определение своего родителя, поэтому директива #include “JavaScriptBaseLexer.h” должен быть представлен в сгенерированном JavaScriptLexer.h файл, иначе код не будет компилироваться, так как имя базового класса не определено. Похоже лексер вариант header может быть добавлен в файл грамматики лексера,

lexer::header {
  #include "JavaScriptBaseLexer.h"
}

но параметры не зависят от языка и появятся в коде, сгенерированном лексером C# / Java, а в коде C# / Java этого не ожидается.

Во-вторых, JavaScriptLexer’s Токен enum должен быть определен где-то перед генерацией исходного кода, который будет использоваться внутри кода базового класса. Эта проблема может быть решена путем включения сгенерированных JavaScriptLexer.h внутри JavaScriptBaseLexer.cpp файл. Выглядит странно...

Есть идеи, как реализовать С # / Java подход в C++? Я буду признателен за любую помощь. Спасибо.

0 ответов

Другие вопросы по тегам