如何实现表达式巴库斯-瑙尔形式的优先级



文档中描述了这种语法:

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

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

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

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

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

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

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

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

所以在你的例子中:

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

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

反转这两个选项将使 Tatsu 首先尝试解析#%,只有在失败时才尝试#

注意:~符号也可用于避免在成功解析模式后尝试规则的其他选项。

最新更新