Antlr4r C # Token Тип значения в сгенерированном коде - PullRequest
0 голосов
/ 19 мая 2019

Я новичок в 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

...