PEGJS : 嵌套的 pegjs 语法
PEGJS : Nested pegjs grammar
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
在输入中同时出现。有没有办法用 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]*
如果接收到 and
我们的 OurExpr
拒绝匹配并跳转到下一个选项。
已测试以下规则:
1 and 2 and 3
=> PASS
1
=> PASS
4 or 2 or 1
=> PASS
9 and 2 or 3
=> FAIL
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
在输入中同时出现。有没有办法用 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]*
如果接收到 and
我们的 OurExpr
拒绝匹配并跳转到下一个选项。
已测试以下规则:
1 and 2 and 3
=> PASS
1
=> PASS
4 or 2 or 1
=> PASS
9 and 2 or 3
=> FAIL