了解 PetitParser2 行为

问题描述 投票:0回答:1

我正在努力使用 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 用户邮件列表中交叉发帖。

谢谢你。

parsing pharo petitparser
1个回答
0
投票

单词结束解析:“你好,再见”。 “它在我期望的时候解析 失败,因为“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
)。

© www.soinside.com 2019 - 2024. All rights reserved.