0

我正在尝试使用这种 TatSu (grako) 中的 EBNF 语法来解析字符串“###”:

grammar = """mask =
                  | ['()'] ['$'] {'#'} '#'
                  | ['()'] {'#'} '#%'
                  | ['()'] ['$'] {'#'} {'0'} '0' '.#' {'#'}
"""

我收到一个错误:

tatsu.exceptions.FailedToken: (1:1) expecting '#' :
#
^
mask
start

我怀疑首先执行搜索{'#'}(匹配'#' 零次或多次),然后找不到'#'(必需的字符'#')。是否有可能以某种方式实现它,以便首先我看到所需的字符'#',然后才寻找{'#'}附加字符?

4

1 回答 1

1

您将需要为&('#'|'0')可选的“#”前缀的所有实例提供积极的前瞻:

    mask = ['()'] ['$'] {'#' &('#'|'0')} '#'
         | # and so on...

请注意,最后一行中重复的“0”前缀也会有同样的问题。您还需要为其添加&'0'前瞻检查。

于 2020-05-23T16:08:17.300 回答