textx - 嵌套表达式导致堆栈溢出
问题描述
我面临一个问题,你们可能可以帮助我解决。
我正在尝试解析包含以下内容的语法:
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 使用带有回溯的递归下降解析(由Arpeggio实现),即它是一种自上而下的方法,默认情况下不支持左递归规则,因为要匹配某些A
规则,它首先必须匹配A
导致无限递归。
为了实现类似表达式的语言,您需要删除所有直接或间接的左递归规则。有一种机械方法可以做到这一点。这种左递归删除的描述适用于琶音,因此适用于 textX。
您还可以在琶音中查看calc 示例。尽管 Arpeggio 中的语法不同,但 Arpeggio 是 textX 的底层引擎,因此那里编写的所有内容都适用于 textX。
另请注意,在转换后的语法中,运算符优先级在语法规则中通过使较低优先级运算符较早匹配而较高优先级运算符较晚匹配来编码在语法规则中。
推荐阅读
- javascript - 并行使用 async / await 并在结果到达时获得结果?
- asp.net-core - 通过 Visual Studio 2019 运行 ASP.NET Core 应用程序
- javascript - 尽管模仿了一个工作组件,但 VueJS 给了我一个“未知的自定义元素”错误
- php - 是否可以将枢轴上的表格与雄辩的 ORM 相关联?
- html - wget 命令下载网页并重命名带有 html 标题的文件?
- php - 侧边栏出现在自定义帖子页面上而不被调用
- chef-infra - 如何在 Linux 服务器中检查 Chef 许可证
- java - 无法在 Apache Tomcat 7 上运行应用程序
- node.js - 无法处理 geojson:JavaScript 堆内存不足
- visual-studio - Team Foundation Server Build Agent 缺少一些功能 - 如何添加?