如何实现这种 EBNF 语法(前瞻)?

How to implement this kind of EBNF grammar (lookahead)?

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

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

我收到一个错误:

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

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

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

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

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