如何将简单的语法转换为适用于PEG.js的东西(预期“a”,但“a”找到)

时间:2012-10-31 14:32:18

标签: javascript parsing peg pegjs

我刚开始玩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不能做的事情,还是可以将我的语法转换成可以解析它的东西?

P.S。如果我试图解析(错误地建议?)bda我得到无意义的错误:

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

2 个答案:

答案 0 :(得分: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”。

答案 1 :(得分:1)

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

这是你所期望的,因为它首先匹配单个匹配,并且由于“b”和“d”匹配,它假定它是好的。按照@HBP的建议,反转顺序会强制它首先匹配复数,只有当它们不存在时,它才会尝试单一,这会产生你期望的结果。