我有一个BNF和EBNF的语法.BNF显然更加冗长.就使用BNF构建递归下降解析器而言,我有一个相当不错的想法; 这有很多资源.我无法找到将EBNF转换为递归下降解析器的资源.这是因为它更难吗?我从我的CS理论课中回忆起我们讨论过EBNF,但是我们没有将它们转换成递归下降的解析器.我们确实将BNF转换为递归下降解析器.
我问的原因是因为EBNF更紧凑.
从一般的EBNF看,我注意到在{和之间包含的术语}可以转换成while循环.还有其他指导方针或规则吗?
您应该研究所谓的元编译器,它实质上将EBNF编译为递归下降解析器.他们如何做到这一点正是你的问题的答案.(它非常直接,但很了解细节).
一篇非常精彩的论文是Val Schorre撰写的"MetaII"论文.这是1964年从诚实到上帝的元编译器技术.在10页中,他向您展示了如何构建一个元编译器,并提供了不仅如此,还提供了另一个编译器和两者的输出!如果您构建其中一个,那么您也会有一个令人惊讶的时刻,在那里您意识到元编译器如何使用自己的语法编译自己.这一刻让我迷上了编译器,大约在1970年我第一次跳过这篇论文.这是软件业务中每个人都应该阅读的计算机科学论文之一.
James Neighbors(软件工程中"域"这个术语的发明者,以及第一个程序转换系统的构建者[基于这些元编译器 ]有一个很棒的在线MetaII教程,对于那些不想要它的人来说 -从头开始经验.(除了邻居和我是本科生之外,我与此无关).
这两种方式都是了解元编译器和从EBNF生成解析器的好方法.
关键思想是规则的左侧创建一个解析非终结符的函数,如果匹配则返回true并提前输入流; 如果不匹配且输入流未前进,则返回false.功能的内容由右侧确定.文字代币直接匹配.非终结符会调用为其他规则生成的其他函数.Kleene*映射到while循环,交替映射到条件分支.EBNF没有解决的问题,以及元编译器所做的是,解析除了说"匹配"之外是做什么的?秘诀是将输出操作编织到EBNF中.MetaII论文使这一切变得清晰.