我有以下PEGjs作品:
NameStartChar = ":" / [A-Z] / "_" / [a-z] / [\u00C0-\u00D6] / [\u00D8-\u00F6] / [\u00F8-\u02FF] / [\u0370-\u037D] /
[\u037F-\u1FFF] / [\u200C-\u200D] / [\u2070-\u218F] / [\u2C00-\u2FEF] / [\u3001-\uD7FF] /
[\uF900-\uFDCF] / [\uFDF0-\uFFFD] / [\uD800-\uDB7F][\uDC00-\uDFFF]
NameChar = NameStartChar / "-" / "." / [0-9] / "\u00B7" / [\u0300-\u036F] / [\u203F-\u2040]
Name = NameStartChar NameChar*
如果我的输入字符串与true
匹配,我希望以某种方式获得Name
,否则为false
。我也不在乎解析组件。
但是,如果匹配失败,PEGjs真的想抛出异常。
我当然可以将它包装在try / catch中,但我更愿意避免这种情况。我也想避免收集已解析的组件(即,在匹配["a", ["b", "c", "d"]]
时我不需要"abcd"
,我只需要true
)。
是否有一些隐藏的PEGjs功能可以使这项工作?也许是一个聪明的行动,或组合者的创新使用?
或许我应该使用完全不同的工具,而不是解析器生成器?如果是这样,有人知道我应该使用什么吗?
答案 0 :(得分:4)
我们可以使用Name { return true } / { return false }
来获取一个表达式,如果规则匹配,它将返回true。然后,我们可以添加!.
来检查我们是否在true
情况的输入的末尾,并且。*在错误的情况下跳到最后。所以我们得到:
ValidateName = Name !. { return true } / .* { return false }
答案 1 :(得分:0)
您定义的名称语言对我来说似乎是正常的,因此您可以使用正则表达式来执行此操作。 根据您使用的语言,您可以调用函数匹配或查找测试输入。
请记住放置行锚的开头和结尾,使其与整个输入匹配,例如
^(:|[A-Z]|_|etc)(:|[A-Z]|_|etc|-|\.|[0-9]|etc)*$
答案 2 :(得分:-1)
ValidateName = Name { return true } / { return false }
如果要在不使用子表达式推进解析器位置的情况下验证输入,可以使用&Name
。