我試圖讓我的解析器規則根據我的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; }
這不是可怕這種情況下,但我有一些其他枚舉,將有更多的選擇,所以我正在尋找任何方法來簡化這一點。
問題是,對於西南標記,它的內部文本('$ DIR.text')可能是「SWEST」,「SW」,「southw」 ... –
這是我一直沒有的角度,但本身我不確定它有幫助。 'Direction.valueOf('North')'會起作用,但是'Direction.valueOf('N')'會導致一個'IllegalArgumentException'事情的發生。 –
也許有一個幫助函數,就像.text,它給你'fragment'的名字?從[這裏]的東西(http://www.antlr.org/wiki/display/ANTLR3/Special+symbols+in+actions)看來,你可能能夠獲得當前令牌的各種屬性 – Confusion