我将此代码用于非常基本的计算器编译器和解释器。
如何将此语法转换为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)}
答案 0 :(得分:2)
有许多工具可以使用语法并生成解析器,从Yacc到提升精神。
编写解析器的艺术已被广泛研究。这不是微不足道的。一种方法是确定您是否可以将BNF转换为LR(1)语法并为其编写LR解析器。
一种简单的解析方法是将解析分为标记化(将事物捆绑到标识符中)和语法树生成。
Wikipedia粗略描述了LR解析。 Knuth的Canonical LR(1) parser也值得一看。
教授如何编写LR(1)解析器(有任何限制,更不用说LR(k)解析器)是一个简短的大学课程或书籍章节,而不是堆栈溢出帖子。
但一般的想法是你从左到右阅读。您向前看k标记(通常为1)以确定要应用于您遇到的下一个标记的规则。您可以自下而上构建解析树。
有许多技术细节,技术,怪癖和问题。并非每个BNF语法都可以转换成LR(1)语法,更不用说许多解析生成器可以处理的限制语法了。
答案 1 :(得分:0)
你看过Yacc了吗?这可能正是你正在寻找的。 p>