首页 > 解决方案 > 嵌套表达式导致堆栈溢出

问题描述

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

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

Expr:  BinOp | Name | Constant ;
Name: id=ID ;
Constant: value=INT ;
BinOp: left=expr op=operator right=expr ;
Operator: Add | Sub ;
Add: 'plus' ;
Sub: 'minus' ;

但这会导致堆栈溢出,因为我猜 BinOp 将自身评估为左 expr,并且它永远都是这样。关于如何解决问题的任何想法?如果可能不需要添加分隔符,如括号。

标签: textx

解决方案


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

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

您还可以在琶音中查看calc 示例。尽管 Arpeggio 中的语法不同,但 Arpeggio 是 textX 的底层引擎,因此那里编写的所有内容都适用于 textX。

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


推荐阅读