【发布时间】:2015-12-08 18:59:04
【问题描述】:
我想提供一个解析器来解析所谓的 Subversion 配置身份验证文件(请参阅patch based authorization in the Subversion red book)。这里我想为像
这样的目录定义规则[/]
* = 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 解析器或解析器/编译器生成方面的专家,所以如果这是一个无法解决的基本问题,我也想知道这一点。
【问题讨论】: