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 2或2 and 2 and 2,但2 or 2 and 2无效。简而言之,我不希望and和or在输入中一起发生。有什么方法可以不涉及javascript和存储以前见过的变量(我已经有了解决方案),而用peg来实现这一点呢?
发布于 2015-08-01 00:16:34
解析表达式语法是确定性的。他们尝试第一场比赛,但在第一次失配时失败了,而且,他们也不会倒退。您只需否定不明确的表达式,您的语法就会像预期的那样工作:
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
https://stackoverflow.com/questions/31440357
复制相似问题