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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值