作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我试图让我的解析器规则根据我的 DIR
标记选择一个枚举值。有没有一种方法可以在不为每个方向创建单独的、成熟的 token 的情况下做到这一点?或者通常是更清洁的方法?
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;
(每个字母都有token片段,方便区分大小写)
枚举是 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; }
对于这种情况,这不是可怕的,但我有一些其他的枚举,它们将有更多的选择,所以我正在寻找任何方法来简化这个。
最佳答案
我对 ANTLR 不是很熟悉,但是从快速浏览文档来看,它的工作方式似乎与 yacc/racc 非常相似,而且它似乎允许在 @member
中定义任意方法> block ,所以我希望你可以使用类似的东西:
dir returns [Direction dir]
: DIR { $result = directionStringToEnum($DIR.text); }
你必须在其中定义一个单独的
public Direction directionStringToEnum(String dir) {
Direction.valueOf(dir.toUpperCase());
}
在 @member
block 中。您可以将其概括为处理任意枚举(但可能以任何丑陋的方式进行,需要 Class.forName())。
关于java - 将 token 映射到枚举值的更好方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7366914/
我是一名优秀的程序员,十分优秀!