通用语言解析器作为有限状态机

时间:2016-04-01 19:43:05

标签: algorithm parsing code-generation lexical-analysis lalr

我为一般语言编写了非常低性能的下降递归解析器(开源,用于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)。

所以我有这些问题:

  1. 这种方法能否取得积极成果?

  2. 它与LL,LR和其他解析器有关系吗?目前我对这些算法的理解还不够,我没有尝试过这些算法。

  3. 对于正确的输入字符串,哪种解析算法更快?我只对解析正确的输入字符串感兴趣,因为我正在使用IDE生成代码生成工具,它可以自己报告错误。所以我需要最快速的算法来完成这个非常具体的任务。

  4. 感谢。

    UPD:

    我最终得到了ANTLRv4,我找到了我语言的目标和运行时间(Swift),我感到非常满意。

1 个答案:

答案 0 :(得分:1)

LALR(k)是O(N),如果你将它减少到机器代码,并且在状态下将令牌分支到下一个状态,则堆叠令牌值"可以快速闪电。通过尝试发展你的想法,不清楚你会得到什么;怎么会比那更快?

[最重要的是解决问题;它通常是你建立词汇的速度,尤其是消除空白]。

如果您对构建工具非常认真,那么您应该使用该工具并采用您可以获得的最佳技术,这样您就不必发明它们。

如果您坚持发明新技术,那么您最终会获得补丁/增强/调整它们,并且永远不会开始构建工具。也许你有个好主意。你必须投入更多精力才能找到答案。

确定你知道你想要实现的目标。