依托Bison强大的工具, 写编译器,先用编译原理搞个计算器玩玩。如下:

Bison工具:

http://coolshell.cn/articles/1547.html

http://www.gnu.org/software/bison/manual/index.html

http://baike.baidu.com/view/1137652.htm

1.1 Languages and Context-Free Grammars

文件:first.y

%{
#define YYSTYPE double
#include <math.h>
int yylex (void);
void yyerror (char const *);
%}
%token NUM
%%
input:
|input line
;
line: '\n'
| exp '\n' {printf("\t%.10g\n", $1);}
;
exp:        NUM           { $$ = $1;           }
| exp exp '+'   { $$ = $1 + $2;      }
| exp exp '-'   { $$ = $1 - $2;      }
| exp exp '*'   { $$ = $1 * $2;      }
| exp exp '/'   { $$ = $1 / $2;      }
/* Unary minus    */
| exp 'n'       { $$ = -$1;          }
;
%%
#include <stdio.h>
int yylex (void)
{
int c;
/* Skip white space.  */
while ((c = getchar ()) == ' ' || c == '\t')
;
/* Process numbers.  */
if (c == '.' || isdigit (c))
{
ungetc (c, stdin);
scanf ("%lf", &yylval);
return NUM;
}
/* Return end-of-input.  */
if (c == EOF)
return 0;
/* Return a single char.  */
return c;
}
void yyerror (char const * error)
{
}
int main()
{
return yyparse ();
}

在Ubuntu的linux下安装Bison2.5,运行:

bison first.y

gcc -o first first.tab.c

运行

./fisrt

1  4  +

5

3  10  *

30

OK。

自己动手写C语言编译器(5)相关推荐

  1. 自己动手写C语言编译器(4)

    Statement由Expression构成,Expression由Token构成,Token由char构成. 从上到下呈现树形结构. 程序是由statement组成的,其实我们要的就是一种判断Sta ...

  2. 自己动手写C语言编译器(暂停)

    1.开源的东西其实并不好用. 2.需要更多的关注Android开发和linux的工具的使用. 3.llvm编译出错的问题一直没有解决. 4.也许需要亲自与llvm的官方进行沟通.这是一个庞大的任务.

  3. 自己动手写C语言编译器(3)

    词法分析器部分完成. 支持: 1.支持单词分割 2.支持数字类型 3.支持字符串 4.支持换行 6.支持注释 不支持: 1.不支持关键字 2.不支持变量. 3.不支持关键字. 4.不支操作符. 偶没有 ...

  4. 自己动手写C语言编译器(2)

    直接上代码 : 支持:左右结合性 // MyCompiler.cpp : Defines the entry point for the console application. // #includ ...

  5. 自己动手写C语言编译器(1)

    直接上代码 (表达式树  在此 初具 模型 ) 由于没有做前期的"词法分析", 1.支持 单个 字符 形式的变量 2.支持 单个 字符形式的操作符 3.支持 优先级 . 不支持 1 ...

  6. java c语言 for_Java能写C语言编译器吗

    用java是可以写语言编译器的,用任何语言工具写都可以.各语言开发工具间只有开发效率的差异,没有可行不可行的区别. 编译器其实就是一个翻译工具,它可以把代码直接翻译成二进制文件交给CPU执行(二进制指 ...

  7. 自己动手制作C 语言编译器(8):表达式

    这是整个编译器的最后一部分,解析表达式.什么是表达式?表达式是将各种语言要素的一个组合,用来求值.例如:函数调用.变量赋值.运算符运算等等. 表达式的解析难点有二:一是运算符的优先级问题,二是如何将表 ...

  8. 自己动手制作C 语言编译器(7):语句

    整个编译器还剩下最后两个部分:语句和表达式的解析.它们的内容比较多,主要涉及如何将语句和表达式编译成汇编代码.这章讲解语句的解析,相对于表达式来说它还是较为容易的. 语句 C 语言区分"语句 ...

  9. keil c语言编译运行,Keil的c语言编译器

    我曾经通过查看反汇编代码对KEILC编译器进行了测试,大概有这么一下内容,也得出一些结论. (1)全局变量:如果程序中定义了全局变量,而且初始值不是0.此时,在程序调到main()函数执行前,除了要进 ...

最新文章

  1. Google Guava Cache 移除监听器
  2. 关于Oracle Stream的安装、配置和使用
  3. 关于你,关于我. 你好 5G
  4. linux命令:mkdir 命令详解
  5. Beagle 0.2.16(附 Ubuntu Edgy 安顿源)
  6. 第八章 OGRE中合成器(也就是传说中的image-based rendering)以及如何在OGRE中对着色器的uniform变量传值
  7. ASP.NET MVC5+EF6+EasyUI 后台管理系统(65)-MVC WebApi 用户验证 (1)
  8. [转]WebGL中文教程
  9. STC - STC15官方库函数 - 串口操作修改
  10. unity上线流程_新的Unity商店上线了
  11. Cortex m0+笔记
  12. python爬网易评论
  13. Unity 3D 入门小游戏 小球酷跑(上)
  14. 网店营销成为运营商营销的重要平台
  15. 我叫mt4服务器注册 满了,我叫MT4注册上限怎么办 人数上限解决办法
  16. 灵感 | 设计平平无奇?试试这种方法!
  17. 入门,前后端实现简单账号密码登录
  18. 黑苹果cpu架构三个问号_苹果三位芯片大神讲述M1背后的故事
  19. linux中默认文件666和目录777的权限关系
  20. 使用 TreeView IE Web 控件

热门文章

  1. Java实现均摊_Java均摊复杂度和防止复杂度的震荡原理分析
  2. 参数估计_数据分析|统计之一个总体参数估计(附代码)
  3. 织梦php首页老是自动恢复,dede首页网址自动加上index.html问题解决方法
  4. element UI 选择器 踩的坑 获取到了value 显示不出对应的 value
  5. python开发环境配置config_manjaro与python开发环境配置
  6. Django搭建个人博客:渲染Markdown文章目录
  7. 牛客练习赛7 E 珂朵莉的数列
  8. 基于AgileEAS.NET SOA 平台SAAS架构技术的开源分销ERP系统-SmartERP.NET下载配置说明
  9. Python3 登陆网页并保持cookie
  10. [Swift]枚举、类与结构体的对比