问题描述
我正在研究解析,更确切地说是解析器组合器,遇到了优先级和关联性问题。
我发现的第一个解决方案是在语法中表达优先权。但这似乎使语法复杂化。由于我正在处理解析器组合器,因此我希望将语法表示为函数组合。我得到的第一个解决方案是这样的
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
。我担心,由于树上有多次遍历,因此无法连续运行。
我的第三个想法(我不知道如何以令人满意的方式实现)是将两者混合在一起。保留组合器,但在组合器的中间添加一些简化逻辑,在某些关键点(但在单独的函数中)会在构建树时对其进行修复,我尝试过类似的操作来删除终端和嵌套序列。
一些问题:
- 大型编译器通常采用什么方法?我知道C需要(1),而python也需要类似(1)。
- 2和3的计算成本是否相同? (在我看来,3较轻,因为它必须访问较少的节点,但我猜想,在最坏的情况下,它的成本将高达2。)
如果在这里读到了,最后谢谢。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)