0

文档中描述了这种语法:

grammar
    =
    | ['()'] ['$'] {'#' &'#'} '#'
    | ['()'] {'#' &'#'} '#%'
    | ['()'] ['$'] {'0' &'0'} '0'
    | ['()'] {'0' &'0%'} '0%'
    | ['()'] ['$'] {'#' &'0'} {'0' &'0'} '0'
    ;

如何正确描述语法,以便在尝试解析字符串时得到以下结果:

对于字符串'######',我们得到的结果(['#', '#', '#', '#', '#'], '#')是 True(第一个规则)

对于字符串'#####%',我们得到的结果(['#', '#', '#', '#'], '#')是 False 它应该是(['#', '#', '#', '#'], '#%')(首先工作,但应该是第二个规则)

对于字符串'000000',我们得到的结果(['0', '0', '0', '0', '0'], '0')是 True(适用的第三条规则)

对于字符串'###000',我们得到的结果(['#', '#'], '#')是 False (首先工作,但应该是第五条规则)

文档中给出的规则是荒谬的还是我做错了什么?

4

1 回答 1

1

Tatsu 按照声明的顺序尝试规则。

所以在你的例子中:

| ['()'] ['$'] {'#' &'#'} '#'
| ['()'] {'#' &'#'} '#%'

第一条规则将#####在读取之前成功匹配%

颠倒这两个选项将使 Tatsu 尝试首先解析#%,并且仅在解析#失败时尝试。

注意:一旦成功解析模式,该~符号还可用于避免尝试其他规则选项。

于 2020-10-17T15:37:09.317 回答