解决优先算法的方法

问题描述

我正在研究解析,更确切地说是解析器组合器,遇到了优先级和关联性问题。

我发现的第一个解决方案是在语法中表达优先权。但这似乎使语法复杂化。由于我正在处理解析器组合器,因此我希望将语法表示为函数组合。我得到的第一个解决方案是这样的

test_two

expr = or(sequence(int,regex("[+-]"),expr),int) int = regex("\d+") or在BNF语法中模拟sequence和多个术语。

_这是非常假设的,如果有兴趣,真实的来源是Rust here。我的问题更多是理论上的问题……还有here更易于管理的python版本_

我想知道的另一个选择是。只需按原样解析输入,然后进行第二次运行以简化输入,并且通过简化我的意思是也解决优先级和相关问题。我没有发现有人这样做,所以我来到了这里。

我想做这样的事情,假设我解析输入|输出类似的东西

a * b + c

然后使用[ a,Op(*,p=0),[ b,Op(+,p=1),[ c ] ] ] (从优先级开始)创建正确的树。这样,我可以创建非常声明性的语法,例如p。我担心,由于树上有多次遍历,因此无法连续运行。

我的第三个想法(我不知道如何以令人满意的方式实现)是将两者混合在一起。保留组合器,但在组合器的中间添加一些简化逻辑,在某些关键点(但在单独的函数中)会在构建树时对其进行修复,我尝试过类似的操作来删除终端和嵌套序列。

我还缺少其他方法吗?这是一个总结

  1. 语法中的表达优先逻辑
  2. 生成整个树并在后面修复优先级
  3. 生成部分树并在生成树时逐步确定优先级

一些问题:

  • 大型编译器通常采用什么方法?我知道C需要(1),而python也需要类似(1)。
  • 2和3的计算成本是否相同? (在我看来,3较轻,因为它必须访问较少的节点,但我猜想,在最坏的情况下,它的成本将高达2。)

如果在这里读到了,最后谢谢。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)