如何使用PEGjs进行验证,而不是解析?

时间:2014-12-28 03:33:52

标签: pegjs

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

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

3 个答案:

答案 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