lex yacc 创建一个桌面计算器
作为学习龙书前4章一个总结,做一个计算器,支持+-*/(),*/优先,lex采用flex2.5.37,yacc采用bison2.7
最后的效果是可以连续输入表达式进行计算,比如3.2+5.3*(6.2+3.3)
首先构建可以单独运行的可以识别浮点数的词法分析器和可以处理单个数字的语法分析器,然后进行修改并将两者结合起来
首先构建独立词法分析器,参考龙书中图4-60
%{
#include "stdio.h"
float yylval;
float NUMBER;
%}number [0-9]+\.?|[0-9]*\.[0-9]+
%%
[ ] { /* skip blanks */ }
{number} { sscanf(yytext, "%f", &yylval);return NUMBER; }
\n|. { return yytext[0]; }
%%int yywrap()
{return 1;
}void main()
{yylex();printf("output:%f\n", yylval);
}
然后构建词法分析器
%{
#include <ctype.h>
%}%token NUMBER%%
line : expr '\n' { printf("output:%f\n", $1); };
expr : expr '+' term { $$ = $1 + $3; printf("expr%f=%f+%f\n", $$,$1,$3); }| expr '-' term { $$ = $1 - $3; printf("expr%f=%f-%f\n", $$,$1,$3); }| term { $$ = $1; printf("expr=%f\n", $1); };
term : term '*' factor { $$ = $1 * $3; printf("term%f=%f*%f\n", $$,$1,$3); }| term '/' factor { $$ = $1 / $3; printf("term%f=%f/%f\n", $$,$1,$3); }| factor { $$ = $1; printf("factor:%f\n", $1); };
factor : '(' expr ')' { $$ = $2; printf("factor(%f)\n", $2);}| NUMBER { $$ = $1; printf("number:%f\n", $1); };
%%
yylex() {int c;c = getchar();if (isdigit(c)){yylval = c-'0';return NUMBER;}return c;
}
void yyerror(char *s)
{printf("%s\n", s);
}
将二者结合起来发现词法分析器不能正确识别浮点数,原因是YACC默认为int,修改即可:#define YYSTYPE float
first.l
%{
%}
number [0-9]+
%%
[ ] { /* skip blanks */ }
{number} { yylval = atoi(yytext);return NUMBER; }
\n|. { return yytext[0]; }
%%int yywrap()
{return 1;
}
second.y
%{
#define YYSTYPE float
#include <ctype.h>
%}%token NUMBER%%
line : expr '\n' { printf("output:%d\n", $1); };
expr : expr '+' term { $$ = $1 + $3; printf("expr%d=%d+%d\n", $$,$1,$3); }| expr '-' term { $$ = $1 - $3; printf("expr%d=%d-%d\n", $$,$1,$3); }| term { $$ = $1; printf("expr=%d\n", $1); };
term : term '*' factor { $$ = $1 * $3; printf("term%d=%d*%d\n", $$,$1,$3); }| term '/' factor { $$ = $1 / $3; printf("term%d=%d/%d\n", $$,$1,$3); }| factor { $$ = $1; printf("factor:%d\n", $1); };
factor : '(' expr ')' { $$ = $2; printf("factor(%d)\n", $2);}| NUMBER { $$ = $1; printf("number:%d\n", $1); };
%%
#include "lex.yy.c"
void yyerror(char *s)
{printf("%s\n", s);
}
第一行 line : expr '\n'是为了让\n作为一个匹配的结束,否则只能计算一次
这样一个计算器就生成了,比自己手动写一个容易多了,当然要理解生成的代码还是很不容易。
关于lex代码阅读可以参考:Flex生成文件分析
bison代码阅读可以参考:Bison生成文件分析
#define YYSTYPE float
lex yacc 创建一个桌面计算器相关推荐
- C++程序设计语言(特别版) -- 一个桌面计算器
前言 这里要介绍各种语句和表达式,将通过一个桌面计算器的程序做些事情,该计算器提供四种座位浮点数的中缀运算符的标准算术运算. 这个计算器由四个部分组成:一个分析器,一个输入函数,一个符号表和一个驱动程 ...
- 如何使用 Java AWT 创建一个简易计算器
本文分享自华为云社区<手把手教你使用 Java AWT 创建一个简易计算器>,作者:海拥 . 关于AWT AWT (抽象窗口工具包)是一个有助于构建 GUI 的 API (图形用户界面)基 ...
- C++程序设计语言——一个桌面计算器示例
目录 C++程序设计语言--一个桌面计算器示例 程序代码 C++程序设计语言--一个桌面计算器示例 C++程序设计语言一书中第10章 10.2节的桌面计算器示例. 程序代码 #include < ...
- linux如何给脚本等创建一个桌面启动图标
本文主要讲述的是linux中如何给应用程序创建一个快速启动图标,话不多说,我们来看实际的操作步骤: 本文的实例是给celipse创建一个启动图标 1.我们需要通过下列命令,来创建一个启动的脚本: ge ...
- 编译原理-如何使用flex和yacc工具构造一个高级计算器
Flex工具的使用方法 Lex 是一种生成扫描器的工具. Lex是Unix环境下非常著名的工具,主要功能是生成一个扫描器(Scanner)的C源码. 扫描器是一种识别文本中的词汇模式的程序. 这些词汇 ...
- 一、Qt初尝试,做一个QT计算器《QT 入门到实战》
学习目标 了解 qt 的基本信息 了解 qt 的下载及安装 了解创建一个基本 qt 项目的流程 了解信号与槽 通过示例了解信号与槽的设置与编写 了解控件添加的方式 了解控件如何使用代码获取其文本 了解 ...
- ubuntu系统下创建软件桌面快捷方式
默认情况下,ubuntu会将自动安装的软件快捷方式保存在/usr/share/applications目录下,如果我们要创建桌面快捷方式,只需要右键-复制-桌面 就Ok 上面的方法是通过系统自动安装软 ...
- 一个桌面弹幕软件,用来记单词刚刚好
弹幕单词是一款桌面弹幕软件,它可以把词条以弹幕的形式呈现在桌面上,不管这个词条是英语单词还是中文成语,只要结合了相关资料,就非常方便的使用鼠标右键查看此弹幕的相关资料,下面我们来看看这个软件如何使用吧 ...
- 编译原理——C++版桌面计算器
编译原理--C++版桌面计算器 系统描述 设计并实现一个桌面计算器,支持基本四则运算,关系运算,可编程运算 基本功能 (1)以命令行方式解析用户输入的表达式,计算并显示结果: (2)支持基本的整型和浮 ...
最新文章
- 在CentOS 7.7 x86_64上安装python3的selenium 3模块实录
- 一年新增457万例,用 Python 揭示癌症的可怕之处
- 使用条件卷积进行实例和全景分割
- atomikos mysql,记一次 Atomikos 分布式事务的使用
- 【控制】《多智能体系统一致性协同演化控制理论与技术》纪良浩老师-第15章-基于竞争关系的离散异构多智能体系统分组一致性
- ./dmitry -p ip或者域名 -f -b
- Zookeeper:基于Zookeeper的分布式锁与领导选举
- python四则运算_四则运算 python
- [程序猿感悟] [悟] 两篇不错的文章 (转载自 stay4it )
- java数据源的几种配置
- Nginx前端设置反向代理,后端Apache如何获取访客的真实IP,结合PHP
- [WSE]如何启用WSE2.0的强大的Trace功能
- 如何避免大规模线上故障?
- java来做Web Service,用哪个框架最好?
- 机器学习基础:极大似然估计(Machine Learning Fundamentals: Maximum Likelihood Estimation)
- 子账号授权服务器,京东子账号装修权限之怎么授权使用详情页模板市场?
- 金士顿优盘不被电脑识别的小技巧
- Mutisim14.0安装后,汉化的详细方法
- Magento国家代码缩写
- 机器学习-GB、GBDT、XGboost、Adaboost