我想提供一个解析器来解析所谓的 Subversion 配置身份验证文件(请参阅Subversion 红皮书中的基于补丁的授权)。在这里,我想为目录定义规则,例如
[/]
* = r
[/trunk]
@PROJECT = rw
所以我有问题的语法部分是路径定义。我目前在 Parslet 中有以下规则:
rule(:auth_rule_head) { (str('[') >> path >> str(']') >> newline).as(:arh) }
rule(:top) { (str('/')).as(:top) }
rule(:path) { (top | ((str('/') >> path_ele).repeat)).as(:path) }
rule(:path_ele) { ((str('/').absent? >> any).repeat).as(:path_ele) }
所以我想分为两种情况:
- 仅查找
[/]
(根目录) - 在所有其他情况下
[/<dir>]
,可能会重复,但必须在没有结束的情况下结束/
有问题的规则似乎是path
定义了一个替代方案,这里/
XOR 类似于/trunk
我已经为这些定义了测试用例,并在运行测试用例时收到以下错误:
Failed to match sequence (SPACES '[' PATH ']' NEWLINE) at line 1 char 3.
`- Expected "]", but got "t" at line 1 char 3.
所以问题似乎是,总是选择替代方案(规则:路径)top
。
这个问题的解决方案(作为语法)是什么?我认为应该有一个解决方案,这看起来像是从这里到那里应该发生的惯用语。我根本不是 PEG 解析器或解析器/编译器生成方面的专家,所以如果这是一个无法解决的基本问题,我也想知道这一点。