处理语法歧义(扑克文件解析)

m.t*_*m.t 4 java parsing javacc ambiguity

我目前正在制作一个扑克手历史解析器,作为我的单身汉项目的一部分.我过去几天一直在做一些研究,并遇到了一些不错的解析器生成器(其中我选择了JavaCC,因为项目本身将用Java编码).

尽管手历史语法非常基本且直截了当,但由于玩家昵称中允许的一组字符存在歧义问题.

假设我们有一个以下格式的行:

Seat 5: myNickname (1500 in chips)
Run Code Online (Sandbox Code Playgroud)

令牌myNickname可以包含任何字符以及空格.这意味着,这两个(1500 in chipSeat 5:有效的绰号-这最终导致的模糊问题.除了长度(4-12个字符)之外,对玩家的昵称没有限制.

我需要解析并存储几个数据以及玩家的昵称(例如在这种特殊情况下的座位位置和筹码数量),所以我的问题是,我在这里有什么选择?

我很乐意使用JavaCC来做这件事:

SeatRecord seat() :
{ Token seatPos, nickname, chipStack; }
{
    "Seat" seatPos=<INTEGER> ":" nickname=<NICKNAME> "(" chipStack=<INTEGER> 
    "in chips)"
    {
        return new SeatRecord(seatPos.image, nickname.image, chipStack.image); 
    }
}  
Run Code Online (Sandbox Code Playgroud)

现在哪个不起作用(由于上述问题)

我还搜索了GLR解析器(显然处理了暧昧的语法) - 但是除了Bison之外,它们似乎大多被放弃或记录不佳,但是它不支持Java的GLR解析器,并且可能太复杂而无法使用anway(除了歧义问题,语法本身是非常基本的,正如我所提到的)

或者我应该坚持自己标记字符串,并使用indexOf(), lastIndexOf()等来解析我需要的数据?只有当它是剩下的唯一选择时我才会这样做,因为它太丑了恕我直言,我可能会错过一些情况(这会导致错误的解析)

Dav*_*ave 7

如果您的输入格式与您指定的一样简单,您可以使用简单的正则表达式:

^Seat ([0-9]+): (.*) \(([0-9]+) in chips\)$
Run Code Online (Sandbox Code Playgroud)

在这种情况下,正则表达式引擎的NFA解决了您的歧义,括号是捕获组,以便您可以提取您感兴趣的信息.