【发布时间】:2016-07-21 18:00:31
【问题描述】:
我为通用语言编写了性能非常低的下降递归解析器(开源,用于 EBNF 语法)。我想通过重写解析器来修复它的性能。
我阅读了有关词法分析、LL、LR、LALR 解析器和 LL(*) 等修改的内容,我阅读了 Dragon Book 的前 3 章(关于词法分析器和解析器),我探索了 ANTLR 等开源项目。
我想知道为什么没有描述这个算法。也许方法不对,我不知道。或者我重新发明了轮子。
假设我们有语法(e: end of file):
A: B? B 1? e
B: 0 | 1
转换后的语法:
A: B B 1 e | B B e | B e
B: 0 | 1
可能的情况:
[01] [01] [1] [e]
[01] [01] [e]
[01] [e]
我们可以构建类似 FSM 的东西:
Symbol #0:
[01]: continue
Symbol #1:
[01]: continue
[e]: parse as "B e"
Symbol #2:
[1]: parse as "B B 1 e"
[e]: parse as "B B e"
它将在 O(N) 时解析令牌流。对于真正的语法,它可以修改为不仅仅是简单的 FSM,但仍然是 O(N)。
所以我有这些问题:
这种方法能产生积极的结果吗?
与LL、LR等解析器有关系吗?目前我对那些算法还没有足够的了解,没有尝试过。
哪种解析算法对于正确的输入字符串更快?我只对解析正确的输入字符串感兴趣,因为我正在制作与 IDE 一起使用的代码生成工具,它可以自己报告错误。所以我需要最快速的算法来完成这个非常具体的任务。
谢谢。
更新:
我最终使用了 ANTLRv4,我找到了我的语言 (Swift) 的目标和运行时,我非常满意。
【问题讨论】:
-
您在转换后的语法中忘记了
B 1 e。但不清楚你在问什么。众所周知,上下文无关语言集是常规语言集的超集。您是否在问如何识别给定的语法实际上是否可以识别常规语言? stackoverflow.com/questions/559763/… -
如果您希望有人告诉您是否正在重新发明一种算法,您应该尝试在 Stack Exchange 的计算机科学分支上询问。 FWIW,LR 解析使用状态机推广到下推自动机。
标签: algorithm parsing code-generation lexical-analysis lalr