2

PetitParser 中的规则是可分配的吗?

有以下规则:

integerLiteral --> hexIntegerLiteral / octalIntegerLiteral / decimalIntegerLiteral
  hexIntegerLiteral     --> hexNumeral , (integerTypeSuffix optional)
  octalIntegerLiteral   --> octalNumeral , (integerTypeSuffix optional)
  decimalIntegerLiteral --> decimalNumeral , (integerTypeSuffix optional)

如果我将它们更改为:

integerLiteral --> (hexIntegerLiteral / octalIntegerLiteral / decimalIntegerLiteral) , (integerTypeSuffix optional)
  hexIntegerLiteral     --> hexNumeral
  octalIntegerLiteral   --> octalNumeral
  decimalIntegerLiteral --> decimalNumeral

then0777L不再被解析。它应该匹配octalNumeral , (integerTypeSuffix optional)或在新版本octalIntegerLiteral , (integerTypeSuffix optional)中,但没有发生。

4

1 回答 1

3

是的,PetitParser 中的有序选择是分布式的。在您的示例中,缺少一些上下文,所以我不知道为什么它对您不起作用。

PetitParser 优化器会自动执行您建议的更改。重写规则(以稍微更一般的形式)定义为:

PPOptimizer>>#postfixChoice
    <optimize>

    | before prefix body1 body2 postfix after |
    before := PPListPattern any.
    prefix := PPPattern any.
    body1 := PPListPattern any.
    body2 := PPListPattern any.
    postfix := PPPattern any.
    after := PPListPattern any.
    rewriter
        replace: before / (prefix , body1) / (prefix , body2) / after
        with: before / (prefix , (body1 / body2)) / after.
    rewriter
        replace: before / (body1 , postfix) / (body2 , postfix) / after
        with: before / ((body1 / body2) , postfix) / after
于 2013-03-20T15:21:28.643 回答