如何为此编写语法(Peg.js中为负先行)?

时间:2018-10-17 20:38:10

标签: context-free-grammar pegjs

编辑:更多信息,请访问Does the Peg.js engine backstep after a lookahead like regexs do?

因此,我一直在学习一般的解释器,特别是最近我与peg.js一起使用语法创建了一个解析器。

这是我遇到的一个问题的例子。其中,以下包含三个“术语”(“ abc def”,“ ghi”和“ jkl”)和两个“定界符”(“。”),我该如何编写语法:

abc def . ghi . jkl

这样做对我来说没问题:

abc . def . ghi

我用了这个:

expression
    = term ( _ delimiter _ term )*

term "term"
    = [a-z]+

delimiter "delimiter"
    = "."

_ "whitespace"
  = [ \t\n\r]+

但是,使用以下方法对我来说是个大问题:

abc def . ghi . jkl

一旦术语本身和定界符共享一个标记-空格-我将无法继续。例如,这不起作用:

term "term"
    = [a-z| ]+

问题在于,我尝试执行的任何操作似乎都要求词法分析器或指针不确定正确的术语,然后移至完成该术语之前的时间,因此它失败了,以为它已经过去了它正在寻找分隔符的空白。

我基本上无法提前说,嗯,这个空间实际上是定界符的第一个值,而不是表达式的最后一个。

“&”之类的先行类型运算符仅控制是否使用匹配项,但仍将指针移到该位置。

实际上,我想在我的术语中同时使用两个定界符:

term1.subterm1a subterm1b . term2 subterm2a.subterm2b
// two terms separated by ' . ' delimiter

我该怎么做?

1 个答案:

答案 0 :(得分:1)

我可能会误解您要完成的工作,但是这样的工作不会吗?

{{1}}