如何实现这种 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'
前瞻性检查。
我正在尝试使用此类 TatSu (grako) 中的 EBNF 语法解析字符串“###”:
grammar = """mask =
| ['()'] ['$'] {'#'} '#'
| ['()'] {'#'} '#%'
| ['()'] ['$'] {'#'} {'0'} '0' '.#' {'#'}
"""
我收到一个错误:
tatsu.exceptions.FailedToken: (1:1) expecting '#' :
#
^
mask
start
我怀疑首先执行了搜索 {'#'}(匹配 '#' 零次或多次),然后找不到 '# '(必需字符“#”)。 是否有可能以某种方式实现它,以便首先我看到所需的字符 '#' ,然后才寻找 {'#'} 附加字符 ?
您将需要为可选“#”前缀的所有实例提供 &('#'|'0')
正面前瞻:
mask = ['()'] ['$'] {'#' &('#'|'0')} '#'
| # and so on...
请注意,最后一行中重复的“0”前缀也会出现同样的问题。您还需要向其添加 &'0'
前瞻性检查。