从类似BNF的语法到Java或C ++

时间:2016-10-28 11:49:43

标签: java c++ bnf

我将此代码用于非常基本的计算器编译器和解释器。

如何将此语法转换为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)}  

2 个答案:

答案 0 :(得分:2)

有许多工具可以使用语法并生成解析器,从Yacc到提升精神。

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

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

Wikipedia粗略描述了LR解析。 Knuth的Canonical LR(1) parser也值得一看。

教授如何编写LR(1)解析器(有任何限制,更不用说LR(k)解析器)是一个简短的大学课程或书籍章节,而不是堆栈溢出帖子。

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

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

作为@UnholySheep的mentioend,The Dragon Book是大多数人从中学习这些技巧的书。

答案 1 :(得分:0)

你看过Yacc了吗?这可能正是你正在寻找的。