我如何为此编写语法(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]+
编辑:更多信息在
所以我一直在学习一般的解释器,特别是我最近一直在使用 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]+