我为一般语言编写了非常低性能的下降递归解析器(开源,用于EBNF语法)。我想通过重写解析器来修复它的性能。
我阅读了关于词法分析,LL,LR,LALR解析器和LL(*)之类的修改,我阅读了Dragon Book的前三章(关于词法分析器和解析器),我探索了像ANTLR等开源项目。
我想知道为什么没有描述这个算法。也许这是错误的方式,我不知道。或者也许我重新发明了轮子。
假设我们有语法(e:文件结尾):
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生成代码生成工具,它可以自己报告错误。所以我需要最快速的算法来完成这个非常具体的任务。
感谢。
UPD:
我最终得到了ANTLRv4,我找到了我语言的目标和运行时间(Swift),我感到非常满意。
答案 0 :(得分:1)
LALR(k)是O(N),如果你将它减少到机器代码,并且在状态下将令牌分支到下一个状态,则堆叠令牌值"可以快速闪电。通过尝试发展你的想法,不清楚你会得到什么;怎么会比那更快?
[最重要的是解决问题;它通常是你建立词汇的速度,尤其是消除空白]。
如果您对构建工具非常认真,那么您应该使用该工具并采用您可以获得的最佳技术,这样您就不必发明它们。
如果您坚持发明新技术,那么您最终会获得补丁/增强/调整它们,并且永远不会开始构建工具。也许你有个好主意。你必须投入更多精力才能找到答案。
确定你知道你想要实现的目标。