编辑:更多信息在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
我怎样才能做到这一点?