用lex和yacc实现的计算器

用Lex(flex)和yacc(bison)写的简单计算器 Lex文件如下: %{#include "cal.tab.h"%}%option noyywrapinteger      [0-9]+dreal        ([0-9]*"."[0-9]+)ereal        ([0-9]*"."[0-9]+[EedD][+-]?[0-9]+)real         {dreal}|{ereal}nl           /nplus         阅读详情

代码

// calc.lex

 

%{

#include <stdio.h>
#define YYSTYPE    double
#include "calc_y.h"

#define PRINT    printf("%s", yytext)

%}

num        [0-9]
real    {num}+|{num}+"."{num}+
add        "+"
sub        "-"
mul        "*"
div        "/"
eq        "="
lb        "("
rb        ")"
sin        "sin"
cos        "cos"
ln        "ln"
log10    "log10"
tanh    "tanh"
sqrt    "sqrt"
exp        "exp"
abs        "abs"
lr        [/r/n]
space    [ /t]
quit    [q]

%%

{real}    { PRINT; yylval = strtod(yytext, NULL); return REAL; }
{add}    { PRINT; return ADD; }
{sub}    { PRINT; return SUB; }
{mul}    { PRINT; return MUL; }
{div}    { PRINT; return DIV; }
{eq}    { PRINT; return EQ; }
{lb}    { PRINT; return LB; }
{rb}    { PRINT; return RB; }
{sin}    { PRINT; return SIN; }
{cos}    { PRINT; return COS; }
{ln}    { PRINT; return LN; }
{log10}    { PRINT; return LOG10; }
{tanh}    { PRINT; return TANH; }
{sqrt}    { PRINT; return SQRT; }
{exp}    { PRINT; return EXP; }
{abs}    { PRINT; return ABS; }
{lr}    { return LR; }
{quit}    { exit(0); }
{space}    {}
.        {}

%%

int yywrap()
{
    return 1;
}

 

// calc.y

 

%{

#include <stdio.h>
#include <math.h>

#define YYSTYPE    double

extern int yylineno;

%}

%token     REAL EQ LR
%right    SIN COS LN LOG10 TANH SQRT EXP ABS
%left    ADD SUB
%left    MUL DIV
%left    RB
%right    LB
%right    UARY

%%

input:
    |    input line
;

line:    LR
    |    exp LR                { printf("=%f/n", $1); }   
;
   
exp:    REAL                { $$ = $1; }   
    |    exp    ADD exp            { $$ = $1 + $3; }
    |    exp    SUB exp            { $$ = $1 - $3; }
    |    exp    MUL exp            { $$ = $1 * $3; }
    |    exp    DIV exp            { $$ = $1 / $3; }
    |    ADD    exp    %prec UARY    { $$ = $2; }
    |    SUB    exp    %prec UARY    { $$ = -$2; }
    |    LB    exp    RB            { $$ = $2; }
    |    SIN LB exp RB        { $$ = sin($3); }
    |    COS LB exp RB        { $$ = cos($3); }
    |    LN LB exp RB        { $$ = log($3); }
    |    LOG10 LB exp RB        { $$ = log10($3); }
    |    TANH LB exp RB        { $$ = tanh($3); }
    |    SQRT LB exp RB        { $$ = sqrt($3); }
    |    EXP LB exp RB        { $$ = exp($3); }
    |    ABS LB exp RB        { $$ = fabs($3); }
;

%%

int main()
{
    yyparse();
    return 0;
}

int yyerror(char *msg)
{
    printf("error: %s in line %d/n", msg, yylineno);
    return 0;
}

// makefile

 

all:calc_y.c calc_l.c
    gcc -g -o calc calc_y.c calc_l.c -lm

calc_l.c:calc.lex calc.y
    flex -o calc_l.c calc.lex

calc_y.c:calc.y
    bison -d -o calc_y.c calc.y
   

clean:
    @rm -f calc *.c *.h
   

// exam.txt

 

10.6/2
3.3*3
10+5
8-3
4*2
1+3*2-5
-1+5
+1+5
5*(3-1)+6
sin(3.1415926/2)
cos(0)
abs(-10.5)
sqrt(16)
ln(5)
log10(10)
exp(5)

 

// 使用方法 1

$ ./calc < exam.txt

 

// 是用方法2

$ ./calc

1+3

1+3=4

q

$

 

 

Lex和Yacc应用方法(二).再识Lex与Yacc Lex和Yacc应用方法(二).再识Lex与Yacc草木瓜  20070314早在二十世记七十年代之前,编写编译器一直是一个非常费时的工作。但到了1975这一年这一切却发生了重大转变,首先Stephen C. Johnson Lesk在贝尔实验室完成了Yacc开发,为了配合yacc更好的协作, Mike Lesk和Eric Schmidt又完成了lex。从而Lex和yacc成为计算机编译领 阅读详情

相关推荐

Lex与Yacc学习(六)之lex & yacc (简单计算器程序) 运行

词法分析程序ch3-01.l %{ #include "ch3-01.tab.h" extern int yylval; %} %% [0-9]+ { yylval = atoi(yytext); return NUMBER; } [ \t] ; /* ignore white space */ \n return 0; /* logical EOF */ . return yytext[0

指尖飞舞 4252

编译原理 yacc lex 制作一个计算器

这篇文档是我从别的地方摘抄的,留给自己以后回忆使用。(写的非常详细!)Flex工具的使用方法Lex 是一种生成扫描器的工具。 Lex是Unix环境下非常著名的工具,主要功能是生成一个扫描器(Scanner)的C源码。扫描器是一种识别文本中的词汇模式的程序。 这些词汇模式(或者常规表达式)在一种特殊的句子结构中定义。一种匹配的常规表达式可能会包含相关的动作。这一动作可能还包括返回一个标记。 当 Le...

月月鸟的博客 8047

使用 Lex 和 Yacc 实现一个简单的计算器

编译原理中的 Lex 和 Yacc 是强大的工具,可以帮助我们构建复杂的编译器和解释器。在编译原理中,Lex(词法分析器生成器)和 Yacc(语法分析器生成器)是常用的工具,用于构建编译器和解释器。在本文中,我们将使用 Lex 和 Yacc 来实现一个简单的计算器,该计算器可以执行基本的数学运算,如加法、减法、乘法和除法。首先,让我们定义我们的计算器语法。在上面的代码中,我们使用正则表达式来定义识别数字的规则,包括整数和浮点数。在上面的代码中,我们定义了语法规则来表示加法、减法、乘法和除法的运算优先级。

UaCode的博客 833

运用Yacc和Lex来DIY计算器

前言 来源于设计计算器的小组作业,运用了Yacc和Lex来设计一个简单的计算器。文章内容为英文,但通俗易懂(用翻译软件翻译一下应该没问题,暂时不校对中文版了(偷懒))。感谢小伙伴们的帮助,以下排名不分先后:️️dzj,lxz,lyhan,skywuuu. 文章有点长,Introduction可跳过,Preparation部分讲的是如何在windows和Ubuntu下安装Flex和Bison,之后是展示我们设计的功能(Demonstration fo functions)和代码解释(Code Explanat

skywuuu的博客 2321

lexyacc-calculator:使用 lex 和 yacc 的科学计算器

lexyacc-计算器 这个解释器包括 2 个文件来运行一个 flex 文件和一个 yacc 文件。 打开终端并转到这些文件所在的文件夹 编写命令 lex bc.l 来编译 lex 文件 然后写yacc term1.y编译yacc文件,这会生成y.tab.c 然后用c编译器编译y.tab.c生成a.out,写命令cc y.tab.c -ly -ll -lm 使用 ./a.out 命令运行 a.out 文件 您的计算器已准备就绪 您可以使用手册中给出的不同功能/运算符 如果你写的不是手册中指定的函数,它会给出语法错误 为了退出计算器,请键入 ctrl+C 。 使用 lex 和 yacc 函数和说明的科学计算器:- log() :- 用于计算对数值的对数函数 pi :- 写 pi 将给出 pi 的值 sin() :- 用于计算 sin 值的 Sin 函数 cos() :- 用于计算

用lex&yacc制作的计算器

很多人都知道lex&yacc,特别是计算机科班毕业的。因为在unix上自带的bshell就有这些功能。 cygwin里面也有这些。 可是,这种基本的功能,在win32平台下,微软似乎忘了。 有个外国人写了个软件Parser Generator (bum-bee). 他把unix的这些功能,做了个软件放到win32平台上。 我的这个例子不是讲这些理论,而是想对那些初学者讲解,如何把这种第三方工具集成到vc中,如何设置vc ide来编译这些文件。 有兴趣的人,可以给我写信。 haoyujie@sohu.com 但我很忙,可能很久也不去一回,所以可能很久才能回。

神奇的lua:lex和yacc实现计算器

在别人的基础上改了一个支持变量的命令行计算器,作为lua编辑

李勇的专栏 3107

使用Lex, Yacc开发的算术表达式解析器,以及算术表达式的计算器

使用Lex, Yacc开发的算术表达式解析器,以及算术表达式的计算器。压缩文件包括代码,工程文件,文档。

使用lex与yacc构建简单计算器

  Normal 0 7.8 磅 0 2 false false false MicrosoftInternetExplorer4 <object cl

crond123的专栏 7162

Cadence Allegro 17.4学习记录开始01-原理图Capture CIS 17.4

Orcad的学习记录

qq_31444421的博客 1万+

半导体测试(一)

探针台是一种用于在晶圆上进行配合探针卡进行电路量测的设备,在测试过程中,探针工作站会将探针与晶圆上的每个die进行接触,以进行电性测量。在这个过程中,每个die都被测试以确保它能基本满足器件的特征或设计规格书(Specification),通常包括电压、电流、时序和功能的验证。晶圆是一个圆形的硅片,在这个半导体的基础之上,建立了许多独立的单个的电路;在所有的die都被探测(Probed)之后,晶圆被切割成独立的dice,这就是常说的die saw,所有被标示为失效的die都被报废,。

m0_37606066的博客 8431

Lex和Yacc应用教程(三).使用变量

 Lex和Yacc应用教程(三).使用变量草木瓜  20070512一、序早在两个月前就想对Lex和Yacc作系列的阐述,然而工作的事情实在太多,很难抽出空静下心去总结学习。不觉感慨国内工作环境恶劣,加班是家常便饭,整天基本都是在做一些简单大量的重复,甚至徒劳无用。在《初识Lex》一文中主要从入门角度总结了Lex,《再识Lex和Yacc》一文在可以简单使用Lex情况基础,介绍了Le

草木瓜 1万+

Excel下拉公式不自动计算?5步彻底解决!

Excel下拉公式不自动计算?5步彻底解决!在使用Excel处理数据时,公式下拉填充是提升效率的核心操作。但许多用户都遇到过这样的困惑:明明设置了公式,下拉时结果却纹丝不动。本文将从技术原理出发,结合5步实操方案,为您彻底解析这个高频问题的根源与解决方案。

mmoo_python的博客 1万+

编译原理之lex,yacc学习

写在前面的几句废话 最近在项目的过程中接触了lex 和 yacc,他们可以帮助我们来实现自己的领域语言。最典型的应用就是可以帮助我们来实现自定义测试脚本的执行器。但是,这里也有一个限制,就是测试脚本要做的基本事情必须有现成的C语言库来实现,否则就做不到了;如果基本的操作是用java来做的,那么还可以用Antlr,这里不对Antlr做详细介绍。 lex是什么? 教科书上把lex的作用的作用叫做“词...

程序员之路-Stay Hungry. Stay Foolish. 65

专访高性能计算专家赵开勇:无人机/机器人开发实战,如何优化深度学习?

从能够自主飞行的无人机,到能和小朋友玩物体识别等游戏的机器人,极客们对智能设备追求没有止境。除了轻巧的体积、超长的续航,更重要的是要有一个智能的“大脑”,来实现人类能够想得到的人机交互,或者智能化的自主决策和行为动作,毫无疑问强大的深度学习能力不可或缺。那么,拒绝束缚人类想象力的嵌入式智能设备,其开发工作需要什么样的环境和工具?开发者进行相关开发的可行思路是什么?近日,优快云记者就此专访了智能设...

happytofly的博客 3509

SAP BSP网页开发入门:从SE80创建到MVC实战(附成品展示)

本文详细介绍了SAP BSP网页开发的入门与实战,从SE80环境搭建到MVC架构实现的全流程。通过具体案例和代码示例,帮助开发者掌握业务服务器页面(BSP)技术,提升SAP Web化转型中的开发效率,适用于需要扩展SAP功能的企业场景。

x1y2z的博客 1万+

lex && yacc

http://www.linuxdiyf.com/viewarticle.php?id=91568 作者:绚丽也尘埃 最近看《GCC-the-Complete-Reference-fly》才知道有lex和yacc这两个有趣的工具,并且fedora core 8也默认安装有这两个工具,所以趁此机会学习一下,以前学编译原理时,知道有yacc这个名词,但是从来没有考虑过它是个什么

hintonic的专栏 2148

URDF模型转换实战:解决SolidWorks到Gazebo的五大常见问题

本文详细解析了从SolidWorks导出URDF模型到Gazebo仿真过程中常见的五大问题及解决方案,包括插件安装、坐标系建立、Link与Joint配置等关键步骤。通过实战经验分享,帮助机器人仿真工程师高效完成模型转换,确保Gazebo仿真准确性。

weixin_29052717的博客 445

Yacc基础语法分析程序(无附加实验内容)

calc.lex %{ /* * 一个简单计算器的Lex词法文件 */ #include void yyerror(char*); /* #include "calc.tab.h" */ %} %% /* a-z为变量 */ [a-z] { yylval = *yytext - 'a';

汉南最後の読書人 1592

阿里开源最强数字人工具 EchoMimicV2,本地部署(一)

EchoMimicV2是阿里推出的半身人体AI数字人项目,基于参考图片、音频剪辑和手部姿势序列生成高质量动画视频,确保音频内容与半身动作的一致性。现在本地部署,安装体验一下。

缘分天空的专栏 4614

Yolov8-pose关键点检测:训练实战篇 | 手部关键点检测

yolo8-pose实战检测手部关键点并优化。

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 3396

yacc 简易计算机规则,YACC 使用说明——计算器实例.pdf

用Yacc 实现计算器功能 说明文件目录1. parser generator2 的环境设置 12. vc++环境的设置(目录设置) 23. 建立YACC文件,实现计算器功能 44. VC++ 的项目设置 75. 用vc++编译Parser Generator 生成的c文件 10首先说一下windows 环境下parser generator 和vc++ 的各项配置。首先需要...

weixin_29357339的博客 841

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

lex yacc 学习

写在前面的几句废话最近在项目的过程中接触了lex 和 yacc,他们可以帮助我们来实现自己的领域语言。最典型的应用就是可以帮助我们来实现自定义测试脚本的执行器。但是,这里也有一个限制,就是测试脚本要做的基本事情必须有现成的C语言库来实现,否则就做不到了;如果基本的操作是用java来做的,那么还可以用Antlr,这里不对Antlr做详细介绍。lex是什么?教科书上把lex的作用的作用叫做“词法分析...

weixin_30546189的博客 386

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

验证Yacc的使用

验证Yacc的使用

火雨(Nick) 2483

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

上一篇: 一个“回”型数字的程序
下一篇: Makefile 常用函数表
blh
blh
博客等级 码龄26年 96粉丝 21原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值