我面临的一个问题可能是你们可以帮助我解决。
我正在尝试分析包含以下内容的语法:
txt = '"some" "words" "but" "no" "commas"'
commas_added = ', '.join(txt.split())
但是这会导致堆栈溢出,因为我猜BinOp会将自身评估为左expr,并且永远都是这样。对解决问题有任何想法吗?如果可能的话,无需添加括号等定界符。
答案 0 :(得分:0)
textX使用具有回溯功能的递归下降解析(由Arpeggio实现),即它是一种自顶向下的方法,默认情况下不支持左递归规则,因为要匹配某些A
规则,首先必须匹配A
才能导致无限递归。
为了实现类似表达式的语言,您需要删除所有直接或间接保留的递归规则。有一种机械方法可以做到这一点。 This description的左递归删除功能适用于琶音,因此适用于textX。
您还可以在琶音中看到calc example。尽管Arpeggio的语法不同,但Arpeggio是textX的基础引擎,因此在此编写的所有内容都适用于textX。
还要注意,在转换后的语法中,通过使优先级较低的运算符较早匹配,而优先级较高的运算符较晚匹配,在语法规则中对运算符优先级进行编码。