首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PEGJS :嵌套pegjs语法

PEGJS :嵌套pegjs语法
EN

Stack Overflow用户
提问于 2015-07-15 20:26:25
回答 1查看 324关注 0票数 1
代码语言:javascript
复制
start
  = intExp

intExp
  = andIntExp
  / orIntExp

andIntExp 
   = integer (andExp intExp)*

orIntExp 
   = integer (orExp intExp)*

andExp 
  = space* "and" space* { return "and";}

orExp 
  = space* "or" space*  { return "or";}

space 
  = [\n \t]

integer "integer"
  = digits:[0-9]+ { return parseInt(digits.join(""), 10); }

我想解析输入就像

2 or 2 or 22 and 2 and 2,但2 or 2 and 2无效。简而言之,我不希望andor在输入中一起发生。有什么方法可以不涉及javascript和存储以前见过的变量(我已经有了解决方案),而用peg来实现这一点呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-01 00:16:34

解析表达式语法是确定性的。他们尝试第一场比赛,但在第一次失配时失败了,而且,他们也不会倒退。您只需否定不明确的表达式,您的语法就会像预期的那样工作:

代码语言:javascript
复制
Start
  = IntExpr

IntExpr
  = OrIntExpr
  / AndIntExpr

OrIntExpr
  = Integer _ !"and" ("or" _ OrIntExpr)?

AndIntExpr
  = Integer _ ("and" _ AndIntExpr)?

Integer "integer"
  = digits:[0-9]+ { return parseInt(digits.join(""), 10); }

_ "space"
  = [\n \t]*

如果接收到OurExpr并跳转到下一个选项,则我们的OurExpr拒绝匹配。

已对下列规则进行了测试:

1 and 2 and 3 => PASS

1 => PASS

4 or 2 or 1 => PASS

9 and 2 or 3 => FAIL

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

https://stackoverflow.com/questions/31440357

复制
相关文章

相似问题

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