2

我正在用 Parslet 编写解析器。在我要解析的文件中,我有以下结构:

Item #1
denis calls 20
anna raises 60
denis calls 40

Item #2
another player raises 60
anna calls 60

...

为了解析这些动作,我做了以下事情:

  • 由于我有有限但未知数量的动作,我制定了一条action规则,并重复了它
  • 对于每个动作,我都会解析所有内容,直到达到有效动作(即“加注”、“跟注”等),因为玩家名称基本上可以包含任何字符。这是玩家名字
  • 然后我解析有效动作,后跟一个空格

问题是玩家姓名规则太贪心,所以,解析后,我得到这样的响应:

{
  item: '1',
  players: [
    { player: 'denis', action: 'calls 20' },
    { player: 'anna', action: 'raises 60' },
    { player: 'denis', action: 'calls 40' },
    { player: '\n\nItem #2\nanother player', action: 'raises 60' },
    { player: 'anna', action: 'calls 60' },
  ]
}

这是我正在使用的代码:

  rule :game_actions do
    game_action >> space
  end

  rule :game_action do
    in_game_action_player >> str(': ') >> in_game_action.as(:action) >> space >> game_action.as(:next).maybe
  end

  rule :in_game_action_player do
    ((str(': ') >> in_game_action).absent? >> any).repeat(1).as(:player)
  end

  rule :in_game_action do
    fold | check | call | bet | raises
  end

所以,这似乎是我的思维问题,而不是解析器,这就是为什么我在这里而不是在论坛等上发帖。你们能帮我弄清楚我做错了什么吗?

4

1 回答 1

1

看起来你只需要说一个名字不能以'\n'开头

str ('\n ').absnt?你的名字规则放在开头。

于 2015-04-24T18:57:18.010 回答