前言

  • 这里要介绍各种语句和表达式,将通过一个桌面计算器的程序做些事情,该计算器提供四种座位浮点数的中缀运算符的标准算术运算。
  • 这个计算器由四个部分组成:一个分析器,一个输入函数,一个符号表和一个驱动程序。

分析器

program:ENDexpr_list END //END表示输入结束 expr_list: expression PRINT // PRINT表示分号 expression PRINT expr_list expression: expression + term expression - term term term: term / primary term * primary primary primary: NUMBER NAME NAME = expression - primary (expression)
  • 语法分析器采用通常的递归下降的风格。终结符由词法分析程序get_token()识别,而非终结符由语法分析函数expr(),term()和prim()识别。一旦一个表达式的两个运算对象都知道,就立即对这个表达式求值。
  • 个人觉得分析器就像是定义程序能接受什么输入,而这里采用递归的形式,例如program代表程序,program可以接受END符号或者expr_list END,而expr_list又继续递归下去可以由其他的组成,直到可以得到一个结束情况。

总代码

#include<iostream>
#include<string> #include<map> #include<cctype> using namespace std; // 将token用他们的字符所对应的整数表示,这样做既方便有效, // 又能帮助使用排错系统的人。 enum Token_value { NAME, NUMBER, END, PLUS='+', MINUS='-', MUL='*', DIV='/', PRINT=';', ASSIGN='=', LP='(', RP=')', }; Token_value curr_tok = PRINT; double expr(bool); double term(bool); double prim(bool); Token_value get_token(); double error(const string&); map<string, double> table; int no_of_errors; int main() { table["pi"] = 3.1415924535; table["e"] = 2.178; while(cin) { get_token(); if(curr_tok == END) break; if(curr_tok == PRINT) continue; cout<<expr(false)<<'\n'; } return no_of_errors; } // 每个分析器都有一个bool参数, // 指明该函数是否需要调用get_token()去取得下一个参数 // expr处理加减,一直到不是加减返回left double expr(bool get) { double left = term(get); for(;;) { switch (curr_tok){ case PLUS: left += term(true); break; case MINUS: left += term(true); break; default: return left; } } } // 函数term处理乘除,采用的方式与expr()处理方法一样 double term(bool get) { double left = prim(get); for(;;) { switch (curr_tok){ case MUL: left *= prim(true); break; case DIV: if (double d = prim(true)) { left /= d; break; } return error("divide by 0"); default: return left; } } } double number_value; string string_value; // prim处理初等项的方式很像expr和term double prim(bool get) { if (get) get_token(); switch(curr_tok) { case NUMBER: { double v = number_value; get_token(); return v; } case NAME: { double& v = table[string_value]; if (get_token() == ASSIGN) v = expr(true); return v; } case MINUS: return -prim(true); case LP: { double e = expr(true); if (curr_tok != RP) return error(" ) expected"); get_token(); return e; } default: return error("primary expected"); } } Token_value get_token() { char ch; do { // 低级输入,改进输入 if(!cin.get(ch)) return curr_tok = END; } while(ch != '\n' && isspace(ch)); switch(ch) { case 0: return curr_tok=END; case '\n': return curr_tok=PRINT; case '+': case '-': case '*': case '/': case ';': case '(': case ')': case '=': return curr_tok = Token_value(ch); case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case '.': cin.putback(ch); cin>>number_value; return curr_tok = NUMBER; default: if (isalpha(ch)) { string_value = ch; while(cin.get(ch) && isalnum(ch)) string_value.push_back(ch); cin.putback(ch); return curr_tok = NAME; } error("bad token"); return curr_tok = PRINT; } } double error(const string& s) { no_of_errors ++; cerr<<"error: "<<s<<'\n'; return 1; }

扩展

  • 自己的代码只是简单的拼接,这里发现一个更好的博客。

转载于:https://www.cnblogs.com/zhengxingpeng/p/6685763.html

C++程序设计语言(特别版) -- 一个桌面计算器相关推荐

  1. C程序设计语言 特别版 pdf

    下载地址:网盘下载 本书是在C++语言和程序设计领域具有深远影响.畅销不衰的著作,由C++语言的设计者编写,对C++语言进行了最全面.最权威的论述,覆盖标准C++以及由C++所支持的关键性编程技术和设 ...

  2. C++程序设计语言——一个桌面计算器示例

    目录 C++程序设计语言--一个桌面计算器示例 程序代码 C++程序设计语言--一个桌面计算器示例 C++程序设计语言一书中第10章 10.2节的桌面计算器示例. 程序代码 #include < ...

  3. c语言课程设计报告-计算器的实现,C语言课程设计--一个简易计算器的设计与实现.doc...

    C语言课程设计--一个简易计算器的设计与实现 扬 州 大 学 ------------------1 程序设计内容:------------------1 课程设计所补充的内容:补充的函数或算法--- ...

  4. C程序设计语言第二版·新版,C程序设计语言(第2版·新版) PDF扫描版[19MB]

    C程序设计语言(第2版·新版) 内容简介: 本书是由C语言的设计者Brian W. Kernighan和Dennis M. Ritchie编写的一部介绍标准C语言及其程序设计方法的权威性经典著作.全面 ...

  5. 【荐书】C程序设计语言(第二版)

    "在大多数人眼中,我是个一事无成.乖僻古怪.令人作呕的人.我毫无社会地位可言,也永远不会有.总之,我是底层人中的底层人.好吧,就算这些看法都完全正确,我也想有那么一天,通过我的作品向他们展示 ...

  6. C语言程序设计Bjarne特别版,C语言程序设计(2013深色背景).ppt

    C语言程序设计(2013深色背景) 主要内容 第1章 C语言概述 第2章 算法 第3章 数据类型.运算符和表达式 第4章 程序设计基础 第5章 数组 第6章 函数 第7章 指针和结构体 第8章 面向对 ...

  7. rust程序设计语言第二版_C语言程序设计(山东联盟青岛大学版)

    第一章 单元测试 1.单选题: 在C语言中,下面标识符非法的是( ). 选项: A:abc3 B:SUMC:sum& D:_name 2.单选题: C语言源程序要正确地运行,必须要有( ). ...

  8. lex yacc 创建一个桌面计算器

    作为学习龙书前4章一个总结,做一个计算器,支持+-*/(),*/优先,lex采用flex2.5.37,yacc采用bison2.7 最后的效果是可以连续输入表达式进行计算,比如3.2+5.3*(6.2 ...

  9. c语言float如何做减法,利用c语言设计开发一个简单计算器,可进行加减乘除运算....

    共回答了18个问题采纳率:94.4% #include #include void add(float num1,float num2) { printf("num1 + num2 = %6 ...

最新文章

  1. 一周飞越50万平方米,无人机检测1.5吨海滩垃圾!自动分类47种,准确率超95%
  2. liunx 下巧妙使用代理服务器(squid)
  3. postgresql修炼之道_PostgreSQL内核开发学习资料
  4. 如何实现7*24小时灵活发布?阿里技术团队这么做
  5. hadoop SecondNamenode
  6. LeetCode 665 非递减数列
  7. 时尚潮流色彩趋势+C4D元素|还在为设计素材发愁?
  8. linux 6.4 安装oracle10g,Red Hat Linux 6.4 安装 Oracle 10g 及问题解决
  9. C#中lock关键字的用法
  10. 飞信2009_那个时代独有的目光局限——浅谈“飞信”的兴衰
  11. 查看oracle的SID
  12. Heapsort 代码 学习笔记 阳春三月版
  13. iOS解决键盘收起时页面上移的问题
  14. ATOM基础教程一ATOM按键绑定(6)
  15. 读《Python编程:从入门到实践》
  16. 使用各种姿势舒服的部署微前端项目(上:打包与上传)
  17. 小程序源码:独家全新娱乐性超高的喝酒神器
  18. 地位不保?亚马逊接下来要努力争取市场份额!
  19. 范型方法 范型参数 范型返回值
  20. 台式机系统安装成功之后,官网下载,安装台式机主板最匹配的官网驱动

热门文章

  1. grep的时候Binary file (standard input) matches 怎么解决?
  2. 一个托盘程序演示 -闹钟 Alert
  3. VIM 正则表达式搜索字符串
  4. Taro+react开发(38)注意请求接口的/
  5. 前端学习(3118):react-hello-react的解决类中方法的this
  6. [vue] vue如何优化首页的加载速度?
  7. [vue] 说说你使用vue过程中遇到的问题(坑)有哪些,你是怎么解决的?
  8. [css] flex与其他有什么不同,用它有什么好处?
  9. 前端学习(2564):如何触发组件的更新
  10. 工作75::一直报404