В ANTLR4 сгенерированный лексер в Java содержит общедоступное поле для каждого токена, где тип поля является простым «int». Есть ли причина, почему ANTLR4 не использует перечисления вместо этого, или есть ли возможность использовать его перечислениями?Есть ли способ сделать ANTLR4 использовать перечисления для генерируемых токенов?
Это упрощенный пример с верхней части моей головы
x.g4
A: 'a';
B: 'b';
XLexer.java
public class XLexer extends Lexer{
public static final int A = 1, B = 2;
}
Я предпочел бы для XLexer вместо этого содержать
public class XLexer extends Lexer{
public static enum Token{
A(1), B(2)
}
}
Это полезно для целей отладки при сбрасывании токенов. В настоящее время имя токена не печатается, вместо этого предоставляется только целочисленное представление.
[@-1,0:0='a',<1>,1:0]
Более читаемый вариант будет иметь < > вместо < 1>
[@-1,0:0='a',<A>,1:0]
Он обсуждался ранее здесь: http://www.antlr3.org/pipermail/antlr-interest/2008- May/028432.html –
В свете этого обсуждения его, вероятно, проще всего для сгенерированного класса lexer содержать массив, который отображает целочисленные значения токенов на имя строки, например, уже сделано для имен режимов и имен правил. Существует массив tokenNames, но он содержит, казалось бы, случайный набор символов. Возможно, это всего лишь ошибка. – jonr