0

编辑:更多信息在Peg.js 引擎在像正则表达式一样前瞻之后后退吗?

所以我一直在学习一般的解释器,特别是我最近一直在使用 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

我怎样才能做到这一点?

4

1 回答 1

1

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

expression
    = terms ( _ delimiter _ terms )*

terms "terms"
    = term ( _ term )*

term "term"
    = [a-z]+

delimiter "delimiter"
    = "."

_ "whitespace"
  = [ \t\n\r]+
于 2018-10-19T13:39:48.953 回答