我正在为一个项目使用pegjs解析器生成器,并且我在创建一个语法时遇到了困难,该语法应该匹配所有单词,直到它不应该匹配的单词集合。例如,在字符串"the door is start“中,我希望能够匹配所有单词,直到is,告诉pegjs解析器从单词is开始解析。我希望解析器中断的单词集合是"is“、"has”和" of“。
当前语法规则如下:
subject "sub" =
s:[a-zA-Z ]+ { return s.join("").trim()}
我如何创建一个前视来阻止解析器在单词上包含我的集合?
(!of|is|has)
发布于 2021-12-07 18:53:27
我知道这个问题是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"
它通过输入"the door is which“生成以下代码:
{ prefix: "the door", breakWord: "is", postfix: "yellow" }
注意几件事:
(!breakWord .)
有点慢;它会针对前缀中的每个字符,提前检查以确保当前输入不是以breakWord
备用集合中的任何单词开始。breakWord
规则中排在第一位。发布于 2016-01-06 07:41:24
这将会起作用
.+(?=\s+(of|is|has))
它匹配一个或多个任意字符(换行符除外),直到遇到前面有空格的' of‘、'is’或'has‘(通过正前视)。
https://stackoverflow.com/questions/34621277
复制相似问题