使用琶音难以编写PEG递归表达语法

问题描述

我的输入文本可能有一个简单的语句,如下所示:

Attackdistance = math.sqrt((FFxpos - xpos)**2 + (FFypos - ypos)**2)
if Attackdistance < 50:
    ball.erase()

在我的语言中,我称其为名称,它表示一组具有各种属性的实例。 在此示例中,它会生成所有飞机实例的 instance_set

我可以在括号中将 filter 应用于任何instance_set:

aircraft

它产生另一个可能减少的instance_set。 并且由于它是一个实例集,所以我可以再次对其进行过滤:

aircraft(Altitude < ceiling)

我愚蠢地以为我可以在语法上做这样的事情:

aircraft(Altitude < ceiling)(Speed > min_speed)

它可以正确解析我的前两种情况,但在最后一种情况下会令人窒息:

instance_set = expr
expr = source / instance_set
source = name filter?

错误报告是在第二个打开的括号之前。

为什么琶音不能看到只有一个过滤后的instance_set本身就是一个过滤后的实例集?

我谦虚地向钉住神灵的钉子提出上诉,等待见识...

解决方法

您的前两种情况都匹配source。一旦source被匹配,就被匹配;那是PEG合约。因此,解析器将不会探索替代方法。

但假设确实如此。那有什么帮助?该规则表明,如果expr不是source,则它是instance_set。但是instance_set只是expr。换句话说,exprsourceexpr。显然,替代方案并不能帮助我们。

我很确定琶音有重复,这是您真正想要的:

source = name filter*