1

我刚开始玩 PEG.js 并且遇到了语法问题(大大简化了调试):

start
  = presingle single
  / preplural plural

presingle
  = "a"
  / "b"

preplural
  = "b"
  / "c"

single
  = "d"
  / "e"

plural
  = "dd"
  / "ee"

我正在使用https://pegjs.org/online

此语法无法解析bdd

Line 1, column 3: Expected "a" but "d" found.

这是 PEG 无法做到的事情,还是我可以将我的语法转换成可以解析它的东西?

PS如果我尝试解析(错误地建议?)bda我得到无意义的错误:

Line 1, column 3: Expected "a" but "a" found.
4

2 回答 2

1

此语法仅更改 start 中子句的顺序,适用于 bdd

start = 
   preplural plural /
    presingle single

presingle
  = "a"
  / "b"

preplural
  = "b"
  / "c"

single
  = "d"
  / "e"

plural
  = "dd"
  / "ee"

对于 bda 显示错误第 1 行第 3 列:应为“dd”或“ee”但找到“a”。

于 2012-10-31T15:10:15.743 回答
1

好消息是,现代版本的 pegjs 给出了错误消息:“第 1 行,第 3 列:预期输入结束,但找到了“d”。” 当给定输入 bdd。

这是您所期望的,因为它首先匹配单个匹配,并且由于“b”和“d”匹配,它假设它是好的。正如@HBP 所建议的那样,颠倒顺序会强制它首先匹配复数,并且只有当它们不存在时,它才会尝试单数,这会给出您期望的结果。

于 2015-09-18T22:38:10.543 回答