今天在读《编译原理及实践》时。看到了一个简单的整数计算器的实现。

依照书上的思路,我略微进行了扩展:

1、从整数计算器扩展到小数计算器。

2、支持除法

3、支持空字符。

执行效果例如以下:

代码非常easy,例如以下:

cal.c:

#include <stdio.h>
#include <stdlib.h> char token; double exp(void);
double term(void);
double factor(void);
char getPrintableChar(void); void match(char expectedToken);
void error(void); int main(void)
{
double result; for (;;)
{
token = getPrintableChar();
if (token == 'q')
break; result = exp();
if (token == '\n')
printf("Result is: %g\n", result);
else
error();
} return 0;
} double exp(void)
{
double temp = term();
while (token == '+' || token == '-')
switch(token)
{
case '+': match('+');
temp += term();
break;
case '-': match('-');
temp -= term();
break;
}
return temp;
} double term(void)
{
double temp = factor();
while (token == '*' || token == '/')
switch(token)
{
case '*': match('*');
temp *= factor();
break;
case '/': match('/');
temp /= factor();
break;
}
return temp;
} double factor(void)
{
double temp;
if (token == '(')
{
match('(');
temp = exp();
match(')');
} else if (isdigit(token))
{
ungetc(token, stdin);
scanf("%lf", &temp);
token = getPrintableChar();
} else
error(); return temp;
} void error(void)
{
fprintf(stderr, "Error!\n");
exit(EXIT_FAILURE);
} void match(char expectedToken)
{
if (expectedToken == token)
token = getPrintableChar();
else
error();
} char getPrintableChar(void)
{
char temp;
do
temp = getchar();
while (isblank(temp)); return temp;
}

程序实现的思路是依照EBNF规则实现,即:

<exp> -> <term> { <addop> <term> }
<addop> -> + | -
<term> -> <factor> { <mulop> <factor> }
<mulop> -> * | /
<factor> -> ( <exp> ) | Number

关于EBNF, 能够參考书上的内容。在这里就不赘述了。

一个计算器的C语言实现的更多相关文章

  1. 程序员修仙之路- CXO让我做一个计算器!!

    菜菜呀,个税最近改革了,我得重新计算你的工资呀,我需要个计算器,你开发一个吧 CEO,CTO,CFO于一身的CXO X总,咱不会买一个吗? 菜菜 那不得花钱吗,一块钱也是钱呀··这个计算器支持加减乘除 ...

  2. 分享:写了一个 java 调用 C语言 开发的动态库的范例

    分享:写了一个 java 调用 C语言 开发的动态库的范例 cfunction.h   代码#pragma once#ifdef __cplusplusextern "C" {#e ...

  3. 研究实验1_搭建一个精简的C语言开发环境(包含部分经典的前言)

    综合研究:      在这部分内容中,将启示我们如何进行独立研究和深度思考(一定要注意这一点,相应的调整自己的学习思想).同时使我们:          (1)认识到汇编语言对于深入理解其他领域知识的 ...

  4. 《C语言入门1.2.3—一个老鸟的C语言学习心得》—清华大学出版社炮制的又一本劣书及伪书

    <C语言入门1.2.3—一个老鸟的C语言学习心得>—清华大学出版社炮制的又一本劣书及伪书 [薛非评] 区区15页,有80多个错误. 最严重的有: 通篇完全是C++代码,根本不是C语言代码. ...

  5. 通过搭建一个精简的C语言开发环境了解一个C程序的执行过程

    一.如何搭建一个精简的C语言开发环境 准备:下载TC2.0,并解压,比如说“d:\tc2.0\tc”目录 1.在C盘建立一个目录minic c:\ md minic 2.从解压的目录中将以下文件拷贝到 ...

  6. 应用于Java中的一个开源的表达式语言(Expression Language)

    OGNL(英文全称:Object Graph Navigation Language,中文名:对象导航图语言)是应用于Java中的一个开源的表达式语言(Expression Language),它被集 ...

  7. Lua 是一个小巧的脚本语言

    Redis进阶实践之七Redis和Lua初步整合使用 一.引言 Redis学了一段时间了,基本的东西都没问题了.从今天开始讲写一些redis和lua脚本的相关的东西,lua这个脚本是一个好东西,可以运 ...

  8. 利用OD破解一个简单的C语言程序

    最近在学习汇编(看的是王爽老师的<汇编语言(第三版)>),然后想尝试使用OD(Ollydbg)软件破解一个简单的C语言程序练练手. 环境: C语言编译环境:VC++6.0 系统:在Wind ...

  9. 用Qt实现一个计算器

    一· 介绍 目的: 做一个标准型的计算器.用于学习Qt基础学习. 平台: Qt 5.12.0 二· 结构框架设计 2.1最终产品样式 界面的设计大体按照win系统自带的计算器做模仿.左边是win7 的 ...

随机推荐

  1. PrintDocument组件打印

    运行效果: 代码: using System; using System.Collections.Generic; using System.ComponentModel; using System. ...

  2. Asp.Net中GridView加入鼠标滑过的高亮效果和单击行颜色改变

    转载自:http://www.cnblogs.com/fly_dragon/archive/2010/09/03/1817252.html protected void GridView1_RowDa ...

  3. 分析一个socket通信: server/client

    分析一个socket通信: server/client1 server 1. 创建一个server_socket文件,并绑定端口,然后监听端口 (socket, bind, listen) 2. 查询 ...

  4. C# 课堂总结4-类(常用的类)

    一.string类 1. str.Length:字符串的长度 *****str[索引号] 2. str.Trim():去除左右两边的空格 *****str.TrimStart():去掉左边的空格str ...

  5. Mac删除废纸篓中的单一文件和文件夹

    http://www.macappbox.com/tips/159/ 通过Automator创建教程: 1.打开Automator并选择新建 2.选择服务类型 3.搜索Run Shell Script ...

  6. C#中调用Windows API时的数据类型对应关系

    原文 C#中调用Windows API时的数据类型对应关系 BOOL=System.Int32 BOOLEAN=System.Int32 BYTE=System.UInt16 CHAR=System. ...

  7. 黑龙江省第七届大学生程序设计竞赛-Mysterious Organization

    描述 GFW had intercepted billions of illegal links successfully. It has much more effect. Today, GFW i ...

  8. Gora_百度百科

    Gora_百度百科     Gora    编辑    目录         1什么是Apache Gora         2为什么要使用Apache Gora         3Gora的一个源代 ...

  9. Java中Timer和TimerTask的使用

    转自:http://www.cdtarena.com/javapx/201306/8893.html java.util.Timer定时器,实际上是个线程,定时调度所拥有的TimerTasks. 一个 ...

  10. Got a packet bigger than 'max_allowed_packet' bytes With statement Mysql终端数据同步不成功解决办法

    在做两个数据库数据拷贝的时候,遭遇 1153 - Got a packet bigger than 'max_allowed_packet' bytes With statement: 遇到这个问题, ...