Я пытаюсь, чтобы мое правило синтаксического анализатора выбрало значение enum на основе моего DIR
токена.Есть ли способ, которым я могу сделать это без создания отдельных, полноценных токенов для каждого направления?Или вообще более чистый подход?
DIR : (NORTH|SOUTH) (EAST|WEST)?
| EAST
| WEST;
fragment NORTH: N '.'? | N O R T H;
fragment SOUTH: S '.'? | S O U T H;
fragment EAST : E '.'? | E A S T;
fragment WEST : W '.'? | W E S T;
(для каждой буквы есть фрагменты токенов для облегчения учета регистра)
Перечисление public enum Direction { NORTH, SOUTH, EAST, WEST, NORTHEAST, NORTHWEST, SOUTHEAST, SOUTHWEST }
Прямо сейчасЕдинственное решение, которое я вижу, - это преобразовать DIR
в правило синтаксического анализатора и разделить токены на отдельные направления:
NORTH: N '.'? | N O R T H;
SOUTH: S '.'? | S O U T H;
dir returns [Direction dir]
: NORTH { dir = Direction.NORTH; }
| SOUTH { dir = Direction.SOUTH; }
Это не ужасно для этого сценария, но у меня естьнекоторые другие перечисления, у которых будет намного больше опций, поэтому я ищу способы упростить это.