Я новичок в Antlr4, пытаюсь создать новый язык и использую пакет nuget Antrl4.CodeGenerator в проекте .csproj.
Я использую отдельный лексер / парсерфайлы грамматики и ссылки на лексер в парсере с помощью options { tokenVocab=Lexer }
.Это приводит к 2 отдельным классам, каждый из которых содержит поля const для значений типа токена.(т.е.: public const int NEWLINE=5;
)
Можно ли назначить пользовательские значения сгенерированным значениям типа токена (5 в приведенном выше примере)?Причина в том, что у меня есть отдельный тип перечисления, уже определяющий постоянные значения для каждого типа токена (то есть: enum TokenKind { NEWLINE= 1000 }
).
В настоящее время я использую статический словарь для сопоставления сгенерированных значений типа токена и значений перечисленияно цель состоит в том, чтобы сгенерированное значение типа токена было напрямую сопоставлено со значением перечисления (т. е. public const int NEWLINE=1000;
)
Я попытался использовать пользовательский файл токена, определяющий значение токенов в отдельном Файл .tokens , но при этом возникают повторяющиеся ошибки токена (код ниже)
LexerTok.tokens :
NEWLINE=5000
Lexer.g4 :
options { tokenVocab=LexerTok; }
NEWLINE: [\r\n]+
Parser.g4
options { tokenVocab=Lexer; }
Но генератор почему-то видит его как новый токен и ошибку, сообщающую, что токен NEWLINE
уже определен.
РЕДАКТИРОВАТЬ : я создал небольшое репродукцию проблемы, доступную по адресу https://github.com/fkpama/Antlr4Tokens.git