您应该调查所谓的metacompilers,它实质上是将EBNF编译为递归下降解析器。他们如何做到这一点正是你的问题的答案。 (它很漂亮,但很好理解细节)。
一篇非常精彩的论文是Val Schorre的“MetaII”论文。这是从诚实到神的1964年的元编译器技术。在10页中,他向您展示了如何构建一个meta编译器,并且提供了不仅如此,而且还提供了另一个编译器以及两者的输出!有一个惊人的时刻,如果你去构建其中一个,你会发现如何使用自己的语法编译自己的元编译器。这一刻让我想起了1970年代当我第一次翻阅这篇论文的时候,编译器已经迷上了编译器。这是那些计算机科学论文之一,每个人在软件业务应该阅读。
James Neighbors(软件工程中术语“域”的发明者,以及第一个程序转换系统的构建者[基于这些元编译器]有一个伟大的在线MetaII tutorial,对于那些不想做的人-IT-从划伤的经验。(我什么都没有做这个,除了邻居和我在大学时)。
这两种方法都了解从EBNF metacompilers和生成语法分析器的好方法。
关键的想法是,规则的左侧创建一个函数来分析非终结符,如果匹配并推进输入流,则返回true;如果不匹配,则返回false并且输入流不前进。 该功能的内容由右侧确定。文字标记直接匹配。 非终结者会调用为其他规则生成的其他函数。 Kleene *映射到while循环,变换映射到条件分支。 EBNF没有解决的问题是, 和元编译器是做什么的,除了说“匹配”还是没有,解析是如何做的? 秘诀在于将输出操作编织到EBNF中。 MetaII纸使所有这些晶莹剔透。
太棒了。感谢您的链接!我一定要检查一下。 – 2010-11-08 17:00:12