我正在努力使用 PetitParser2 的小型解析器。这是我定义的一些规则的片段,但它们的行为并不像我预期的那样:
andKeyword := 'and' asPParser trim, #letter asPParser not.
notKeyword := 'not' asPParser trim, #letter asPParser not.
keyword := andKeyword / notKeyword.
nonKeywordIdentifier := keyword not, #letter asPParser, #word asPParser star.
word := nonKeywordIdentifier, #blank asPParser star.
words := word star.
“nonKeywordIdentifier”的行为是预期的:
identifier end parse: 'hello'. "It parses successfully"
identifier end parse: 'and'. "It fails as 'and' is a keyword"
但是“words”规则的行为如下:
words end parse: 'hello Pharo'. "It parses successfully"
words end parse: 'hello and bye'. "It parses, when I would expect it fails because 'and' is a keyword"
我不明白为什么“单词”规则会这样工作,但我从 PetitParser 开始。有什么建议吗?
PS:很抱歉在 Pharo 用户邮件列表中交叉发帖。
谢谢你。
单词结束解析:“你好,再见”。 “它在我期望的时候解析 失败,因为“and”是关键字”
nonKeywordIdentifier := keyword not, #letter asPParser, #word asPParser star.
word := nonKeywordIdentifier, #blank asPParser star.
words := word star.
它会解析,因为您创建了一个循环。
word
调用nonKeywordIdentifier
,反之亦然。 即使你只有 #letter asPParser
,但这也会匹配 #word asPParser star
次(注意最后的 star
)。