您应该研究所谓的元编译器,它本质上将 EBNF 编译为递归下降解析器。他们如何做到这一点正是您的问题的答案。(它非常简单,但很好理解细节)。
Val Schorre 的“MetaII”论文是一篇非常棒的论文。这是 1964 年老实说的元编译器技术。在 10 页中,他向您展示了如何构建元编译器,并且不仅提供了元编译器,还提供了另一个编译器以及两者的输出!。如果你去构建其中的一个,你也会来一个令人惊讶的时刻,在那里你意识到元编译器是如何使用自己的语法编译自己的。大约在 1970 年,当我第一次被这篇论文绊倒时,这一刻让我迷上了编译器。这是软件行业的每个人都应该阅读的计算机科学论文之一。
James Neighbors(软件工程中“领域”一词的发明者,第一个程序转换系统 [基于这些元编译器] 的构建者)有一个很棒的在线MetaII 教程,适合那些不想动手做的人从头开始的经验。(除了我和邻居是本科生之外,我与此无关)。
这两种方式都是了解元编译器和从 EBNF 生成解析器的好方法。
关键思想是,规则的左侧创建了一个函数,该函数解析该非终结符并在匹配时返回 true 并推进输入流;如果没有匹配并且输入流没有前进,则返回 false。函数的内容由右手边决定。文字标记直接匹配。非终结符导致调用为其他规则生成的其他函数。Kleene* 映射到 while 循环,alternation 映射到条件分支。EBNF 没有解决的问题,而元编译器解决了,除了说“匹配”或不说“匹配”之外,解析如何做任何事情?秘诀是将输出操作编织到 EBNF 中。MetaII 论文让这一切变得一清二楚。