gpt4 book ai didi

java - 将 token 映射到枚举值的更好方法?

转载 作者:行者123 更新时间:2023-12-01 14:24:40 25 4
gpt4 key购买 nike

我试图让我的解析器规则根据我的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com