gpt4 book ai didi

javascript - PEGJS : Nested pegjs grammar

转载 作者:行者123 更新时间:2023-11-30 16:44:32 24 4
gpt4 key购买 nike

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 or 2 and 2 and 22 or 2 and 2 无效。简而言之,我不希望 andor 在输入中一起出现。有没有什么方法可以用 peg 做到这一点,而不涉及 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 如果收到 and 则拒绝匹配并跳转到下一个选项。

已测试以下规则:

1 and 2 and 3 => PASS

1 => 通过

4 或 2 或 1 => 通过

9 和 2 或 3 => 失败

关于javascript - PEGJS : Nested pegjs grammar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31440357/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com