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

2024-04-30 01:26:06 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

我得到一个错误:

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

我怀疑搜索{'#'}(匹配'#'零次或多次)是首先执行的,之后无法找到'#'(必需字符'#')。 是否可以以某种方式实现它,以便首先看到所需的字符'#',然后再查找{'#'}其他字符


Tags: 字符串错误方式语法maskgrako字符start
1条回答
网友
1楼 · 发布于 2024-04-30 01:26:06

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

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

请注意,最后一行中重复的“0”前缀将有相同的问题。您还需要向它添加一个&'0'前瞻检查

相关问题 更多 >