我如何为此编写语法(Peg.js 中的负前瞻)?

How do I write a grammar for this (negative lookaheads in Peg.js)?

编辑:更多信息在

所以我一直在学习一般的解释器,特别是我最近一直在使用 peg.js 从语法创建解析器。

这是我遇到的问题的示例。其中,下面包含三个"terms"('abc def'、'ghi'、'jkl')和两个"delimiters"('.'),我怎么写语法:

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

一旦条款本身和定界符共享一个标记——白色space——我就无法继续。这例如不起作用:

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

问题是我尝试的任何事情似乎都需要词法分析器或指针,我不确定正确的术语,在完成术语之前移动到句点,所以它失败了,认为它有已经通过了它正在寻找分隔符的白色space。

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

像“&”这样的前瞻类型运算符只控制匹配是否被消耗,但仍然将指针移动到这个位置。

事实上,我想像这样在我的术语中使用我的两个分隔符:

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

我怎样才能做到这一点?

我可能误解了你想要完成的事情,但这样的事情行不通吗?

expression
    = terms ( _ delimiter _ terms )*

terms "terms"
    = term ( _ term )*

term "term"
    = [a-z]+

delimiter "delimiter"
    = "."

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