从类似bif的语法到Java或c++

From BNF-like grammar to Java or C++

本文关键字:Java c++ 语法 bif      更新时间:2023-10-16

我将把这段代码用于一个非常基本的计算器编译器和解释器。

如何将此语法转换为c++或Java?

expr         ->term moreterms
moreterms    -> +term {print(‘+’)} moreterms
         |­‐term {print(‘‐’)} moreterms
         |ε
term        ->factor morefactors
morefactors ->*factor {print(‘*’)} morefactors
         |/factor {print(‘/’)} morefactors
         |ε
factor      ->(expr)
         |id {print(id)}
         |num {print(num)}  

有许多使用语法和生成解析器的工具,从Yacc到boost spirit。

编写解析器的艺术已被广泛研究。这不是微不足道的。一种方法是确定是否可以将您的BNF转换为LR(1)语法,并为其编写LR解析器。

一种简单的解析方法是将解析分为标记化(将内容捆绑到标识符中)和语法树生成。

Wikipedia对LR解析有一个粗略的描述。Knuth的Canonical LR(1)解析器也值得一看。

教授如何编写LR(1)解析器(无论有什么限制,更不用说LR(k)解析器了)是大学短期课程或书籍章节的问题,而不是堆栈溢出文章。

但一般的想法是你从左到右阅读。您提前查看k个标记(通常为1个),以确定将哪个规则应用于您遇到的下一个标记。您从自底向上构建解析树。

有很多技术细节、技巧、怪癖和问题。并不是每个BNF语法都可以转换成LR(1)语法,更不用说许多解析生成器可以处理的受限语法了。

正如@UnholySheep所提到的,龙书是大多数人学习这些技巧的书。

你看了Yacc吗?