3

我有以下 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 功能可以使这项工作?也许是一个聪明的动作,或者是对组合器的创新使用?

或者也许我应该使用完全不同的工具,而不是解析器生成器?如果是这样,有人知道我应该使用什么吗?

4

3 回答 3

4

我们可以使用Name { return true } / { return false }来获取一个表达式,如果规则匹配,该表达式将返回 true。然后,我们可以添加!.以检查我们是否在true案例输入的末尾,并且 .* 在错误案例中跳到末尾。所以我们得到:

ValidateName = Name !. { return true } / .* { return false }
于 2014-12-29T20:35:20.670 回答
0

您定义的名称语言对我来说似乎是常规的,因此您可以使用正则表达式来完成。根据您使用的语言,您可以调用函数 match 或 find 来测试您的输入。

请记住放置开始和行尾锚点,以便它匹配整个输入,例如

^(:|[A-Z]|_|etc)(:|[A-Z]|_|etc|-|\.|[0-9]|etc)*$
于 2014-12-28T04:05:20.887 回答
-1
ValidateName = Name { return true } / { return false }

如果您想在不使用子表达式推进解析器位置的情况下验证输入,您可以使用&Name.

于 2014-12-28T20:48:04.683 回答