如何解决使用琶音难以编写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
。换句话说,expr
是source
或expr
。显然,替代方案并不能帮助我们。
我很确定琶音有重复,这是您真正想要的:
source = name filter*
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。