使用 Pest.rs,如果 PUSH 是可选的,如何避免“在空堆栈上调用 peek”?

问题描述

pest.rs 能够推送和查看堆栈。这在用户提供定界符时很有用,例如 Perl 和 Postgresql(双美元语法)中的自定义引用。如果项目可能不在堆栈中,我该怎么做。例如,Exim 配置文件指出,

也可以使用换行符和其他控制字符(代码值小于 32 的字符,加上 DEL)作为列表中的分隔符。 必须在处理列表时按字面意思提供此类分隔符。对于字符串扩展的选项,您可以使用普通转义序列编写分隔符。这将在字符串被解释为列表之前由扩展器处理。例如,如果一个以换行符分隔的域列表是通过查找生成的,您可以直接通过这样的一行来处理它:

chromatic = ['C','C#','D','D#','E','F','F#','G','G#','A','A#','B','C','B']


def major(tom):
    major_scale = [2,2,1,1]
    step = 0
    t = chromatic.index(tom)
    m = []
    while len(m) < 8:
        m.append(chromatic[t])
        if len(m) == 8:
            break
        t += major_scale[step]
        step += 1
    return m


x = major('D')
print(x)

您可以在此处看到覆盖 domains = <\n ${lookup MysqL{.....}} 认分隔符的令牌 <\n 是可选的。你可以看到这里的语法本质上是,

:

但是当我跑步时,我得到了,

peek 在空栈上被调用

无论如何,是否可以使用 PEG 来提供此操作,以便将列表作为字符串呈现给用户,但作为元素标记的实际列表?

解决方法

我已经开始采用的一种方法是确保 PUSH 始终发生。甚至似乎可选的 PUSH 应该是编译器错误,

而不是

~ PUSH(list_sep)?

这样做,

~ PUSH(list_sep?)