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

问题描述 投票:0回答:2

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

如何将此语法转换为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)}  
java c++ bnf
2个回答
2
投票

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

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

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

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

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

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

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

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


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.