首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用PEGjs进行验证,而不是解析?

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

Stack Overflow用户
提问于 2014-12-28 03:33:52
回答 3查看 465关注 0票数 3

我有以下PEGjs产品:

代码语言:javascript
复制
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确实希望抛出异常。

我当然可以试着抓住它,但我宁愿避免它。我也想避免收集解析的组件(也就是说,我在匹配["a", ["b", "c", "d"]]时不需要"abcd",我只需要true)。

是否有一些隐藏的PEGjs特性将使这一工作?也许是一种聪明的行动,或者是组合子的创新使用?

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-12-29 20:35:20

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

代码语言:javascript
复制
ValidateName = Name !. { return true } / .* { return false }
票数 4
EN

Stack Overflow用户

发布于 2014-12-28 04:05:20

您定义的名称语言在我看来是正常的,所以您可以使用正则表达式来完成它。根据您使用的语言,您将调用一个函数匹配或查找来测试您的输入。

记住要放置行锚的开始和结束,以便它与整个输入相匹配,例如

代码语言:javascript
复制
^(:|[A-Z]|_|etc)(:|[A-Z]|_|etc|-|\.|[0-9]|etc)*$
票数 0
EN

Stack Overflow用户

发布于 2014-12-28 20:48:04

代码语言:javascript
复制
ValidateName = Name { return true } / { return false }

如果您想验证输入而不使用子表达式提升解析器的位置,则可以使用&Name

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27673480

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档