0

我正在为一个项目使用 pegjs 解析器生成器,我很难创建一个应该匹配所有单词的语法,直到它不应该匹配的单词集合。作为字符串“门是黄色的”中的一个示例,我希望能够匹配直到 is 的所有单词,告诉 pegjs 解析器从单词 is 开始解析。我想让解析器中断的单词集合是“is”、“has”和“of”。

目前的语法规则如下:

subject "sub" = 
s:[a-zA-Z ]+ { return s.join("").trim()}

如何创建阻止解析器包含我的单词集合的前瞻性?

(!of|is|has)
4

2 回答 2

0

我知道这个问题是 5 年前提出的,但我只是在清理 [pegjs] 标签中未回答的问题。

这似乎有效,您只需要替换postfix为您的进一步处理规则。

subject "sub" =  prefix:prefix breakWord:breakWord postfix:postfix "\n"? {
  return { prefix: prefix, breakWord, postfix }
}

prefix = $(!breakWord .)* { return text().trim() }
postfix = [^\n]* { return text().trim() }

breakWord
  = "is"
  / "has"
  / "of"

它通过输入“门是黄色的”生成这个:

{ prefix: "the door", breakWord: "is", postfix: "yellow" }

注意几件事:

  • 表格(!breakWord .)有点慢;它向前看以确保当前输入不以breakWord替代集合中的任何单词开头——对于前缀中的每个字符。
  • 如果您有以一组常见字符开头的中断词(例如“is”和“isn't”),请确保较长的词在breakWord规则中位于第一个位置。
  • 当前postfix规则假定换行符可能会终止输入。
于 2021-12-07T18:53:27.210 回答
-1

这将起作用

.+(?=\s+(of|is|has))

它匹配一个或多个任意字符(换行符除外),直到遇到前面有空格的“of”、“is”或“has”(通过正向前瞻)。

于 2016-01-05T23:41:23.780 回答