嵌套表达式导致堆栈溢出

时间:2019-10-10 15:26:47

标签: textx

我面临的一个问题可能是你们可以帮助我解决。

我正在尝试分析包含以下内容的语法:

txt = '"some" "words" "but" "no" "commas"'
commas_added = ', '.join(txt.split())

但是这会导致堆栈溢出,因为我猜BinOp会将自身评估为左expr,并且永远都是这样。对解决问题有任何想法吗?如果可能的话,无需添加括号等定界符。

1 个答案:

答案 0 :(得分:0)

textX使用具有回溯功能的递归下降解析(由Arpeggio实现),即它是一种自顶向下的方法,默认情况下不支持左递归规则,因为要匹配某些A规则,首先必须匹配A才能导致无限递归。

为了实现类似表达式的语言,您需要删除所有直接或间接保留的递归规则。有一种机械方法可以做到这一点。 This description的左递归删除功能适用于琶音,因此适用于textX。

您还可以在琶音中看到calc example。尽管Arpeggio的语法不同,但Arpeggio是textX的基础引擎,因此在此编写的所有内容都适用于textX。

还要注意,在转换后的语法中,通过使优先级较低的运算符较早匹配,而优先级较高的运算符较晚匹配,在语法规则中对运算符优先级进行编码。