[C++][第1篇]简单算术表达式计算器

代码出处

这本(零基础编程入门)书(有中文版) 作者 Bjarne Stroustrup 的第6章 到 第7章 实现了一个算术表达式的解释器。

功能,即支持的操作如下 :
- 基本运算 + - * / %
- 括号( ) 
- 负数
- 变量

功能展示

[C++][第1篇]简单算术表达式计算器_第1张图片
简单算术表达式计算器

什么是解释器

  • 简单说,读入一个表达式就计算它的值。
    • 在解释器眼里 1.0+2.0*5.0 是 1.0+10.0 是11.0,也就说遇到 2.0 * 5.0 不会一直存着 2.0 * 5.0,而是马上就计算出来是10.0,如果 10.0 还可以进行计算就马上进行 1.0+10.0 的计算,就是11.0了。

会用 C++ 写函数和class,就可以实现这个解释器了

不需要用到的

- 模板编程?template ? 
  不需要的!

- 面向对象虚函数多态?
  不需要的!

需要用到的编程技术——文法(Grammer)

- 那么我现在需要马上去找一本厚厚的编译原理书,开始学习文法(Grammer)吗?
  不需要的啊!!!

这本书会告诉你现在需要的全部,现在跟着这本书走就可以了。

文法 到 C++代码

  • 文法(书上给的)
// a simple expression grammar:
Expression:
  Term
  Expression "+" Term 
  Expression "–" Term
Term:
  Primary
  Term "*" Primary 
  Term "/" Primary 
  Term "%" Primary 
Primary:
  Number
  "(" Expression ")" 
Number:
  floating-point-literal

如何验证这个文法的正确性

书上 第六章 有好几个典型的、非常漂亮的 图形化 举例过程,强烈推荐去看!!!

让 文法规则 活起来的一个重要方法就是 给它写一个函数

get_token();   // 利用 cin 读取字符并且组合成一个Token(我们自定义的一种格式)
expression();   // 调用term() 和 get_token() 来处理 加法 和 减法
term();   // 调用primary() 和 get_token() 来处理 乘、除和取余
primary();   // 调用expression() 和 get_token() 来处理 括号 和 数值

A program that implements a grammar is often called a parser.
Page 195

实现一个文法的程序通常被称作parser,所以这篇博客的标题当然也可以一本正经地写成 **C++ 语言 实现 算术表达式 parser **。

这些函数的返回值是什么?

  • 遇到诸如 1.0+2.0 * 5.0 这样的表达式就马上计算它的值expression term primary 自然是返回一个 double类型;
  • get_token() 处理的是我们自定义一种名为Token的类型变量 , 返回的就是Token类型;

至此为止的全部代码

// file : Calculator.cpp

#include "std_lib_facilities.h"

class Token {   /* . to-do[1] . */ };
class Token_stream {   /* . to-do[2] . */ };
void Token_stream::putback(Token t) {   /* . to-do[3] . */ }
Token Token_stream::get() {   /* . to-do[4] . */ }
Token_stream ts;   // provides get() and putback()  // to-do[5]

double expression();   // declaration so that primary() can call expression()
double primary() {   /* . to-do[8] . */ }   // deal with numbers and parentheses
double term() {   /* . to-do[7] . */ }   // deal with * and /
double expression() {   /* . to-do[6] . */ }   // deal with + and –

int main() {   /* .to-do[ ]. */ }   // main loop and deal with errors

把这些 to-do 都填满,这个 算术表达式的解释器 的功能就实现了;

完整可运行源码 官网可下载

  • 头文件 std_lib_facilities.h;
  • 整本书代码包,找到 chapter6 chapter7

如何使用这个头文件

  • 将头文件下载下来以后,将其命名为 std_lib_facilities.h
  • 新建一个.cpp文件,命名随意,比如 Calculator.cpp
  • 将两个文件放在同一个目录下面(即同一个文件夹里面)
  • 使用#include "std_lib_facilities.h" 就可以导入这个头文件 ;
  • 之后全部的代码只写到 Calculator.cpp 里面,头文件是不用修改的;

基于文法的简单算术表达式计算器 系列索引

  • [C++][第0篇] 系列索引 基于文法的算术表达式解释器
    关键词 系列索引

你可能感兴趣的:([C++][第1篇]简单算术表达式计算器)