使用EBNF或BNF编写递归下降解析器更容易吗?

时间:2010-03-24 18:03:25

标签: grammar bnf ebnf

我的语法有BNF和EBNF。 BNF显然更加冗长。就使用BNF构建递归下降解析器而言,我有一个相当不错的想法;这有很多资源。我无法找到将EBNF转换为递归下降解析器的资源。这是因为它更难吗?我从我的CS理论课中回忆起我们讨论过EBNF,但是我们没有将它们转换成递归下降的解析器。我们做了过去将BNF转换为递归下降解析器。

我问的原因是因为EBNF更紧凑。

通过查看EBNF,我注意到{}之间的术语可以转换为while循环。还有其他指导方针或规则吗?

3 个答案:

答案 0 :(得分:7)

你应该研究所谓的metacompilers,它基本上将EBNF编译成递归下降解析器。他们如何做到这一点正是你的问题的答案。 (它非常直接,但很了解细节)。

一篇非常精彩的论文是Val Schorre撰写的“MetaII”论文。这是1964年从诚实到上帝的元编译器技术。在10页中,他向您展示了如何构建一个元编译器,并提供了不仅如此,而且另一个编译器以及两者的输出!如果您构建其中一个,那么您也会有一个令人惊讶的时刻,在那里您意识到元编译器如何使用自己的语法编译自己。这一刻让我 大约在1970年,当我第一次跳过这篇论文时,他迷上了编译器。这是计算机科学论文中的一篇,软件业务中的每个人都应阅读。

詹姆斯邻居(软件工程中“域”一词的发明者,以及第一个程序转换系统的构建者[基于这些元编译器]在网上有很好的MetaII tutorial,对于那些没有我想要从头开始做经验。(除了邻居和我是本科生之外,我与此无关。)

这两种方法都是了解元编译器和从EBNF生成解析器的好方法。

关键思想是规则的左侧创建一个解析非终结符的函数,如果匹配则返回true并使输入流前进;如果不匹配且输入流未前进,则返回false。 功能的内容由右侧确定。文字代币直接匹配。 非终结符会调用为其他规则生成的其他函数。 Kleene *映射到while循环,交替映射到条件分支。 EBNF没有解决的问题, 和metacompilers一样,除了说“匹配”之外,解析是做什么的? 秘诀是将输出操作编织到EBNF中。 MetaII论文使这一切变得清晰。

答案 1 :(得分:4)

两者都不比另一个更难。迭代实现某些东西和递归实现某些东西之间真的不同。在BNF中,一切都是递归的。在EBNF中,一些递归是迭代表达的。 EBNF语法有不同的变化,所以我只使用英语......“零或更多”是一个简单的while循环,如你所发现的那样。 “一个或多个”与后面跟着“零或更多”的一个相同。 “零次或一次”是一个简单的if语句。这应该涵盖大多数情况。

答案 2 :(得分:1)

早期的元编译器META II和TREEMETA及其亲属并不是完全递归的正确解析器。他们被称为使用递归函数。这只是意味着他们可以称之为自我。

我们不会将C称为递归语言。 C或C ++函数的递归方式与早期元编译器的递归方式相同。

可以使用递归。他们是编程语言。递归通常仅在分析nexted语言结构时使用。例如带括号的表达式和nexted块。

更多的LR递归正常组合。 CWIC最后记录的一个具有广泛的回溯和前瞻功能。 ' - 'not运算符可以匹配任何语言结构。并反驳它的成败。例如,如果术语匹配,则会失败。输入永远不会提前。 '?'向前看并匹配任何语言构造?例如,expr会尝试解析expr。向前看'?'匹配的构造不会保留或输入提前。

相关问题