使用Lex, Yacc 编写的算术表达式的解析器和计算器工具

整理旧机器,看到自己刚工作不久时做的算术表达式的解析器和计算器工具。那是头一次使用Lex, Yacc 来开发东西,挺喜欢这种编程模式。对比过程式的编程,这类声明型的编程只需要编写若干规则,词法语法产生式,由引擎按这些规则来做逻辑处理。抽象一些说, 只定义对象的内在和外在的反应规则,由对象自己去按这些规则去生活;而不是强制地让对象做一系列的反应,让这些对象只能是死的对象。

开发这类程序的关键是要对所有的状态迁移,状态机模型有清晰,准确的了解,不能有不应该出现的环路,不能有冲突的规则优先级。另外当运行结果与设计 不符合的时候,调试并且发现错误也比较麻烦,一些工具提供了调试器,但对比过程式的编程,声明型程序的调试还是要麻烦一些,更依赖于编程者的功力。

如今,声明型编程的规则引擎运用逐渐普遍,在业务活动监控,风险控制,算法交易方面,声明型编程的应用会越来越广。需要在这方面多多积累。

源代码,文档都上传至 http://download.csdn.net/source/2457085 。 传统的计算器工具都是从左至右单步计算的,这里开发的工具可以输入完整的算术表达式( 包含括号) ,一次计算求值,表达式里还可以带未知数,在表达式后面给 未知数赋值即可。使用试例如下,

>expression (5+3)*9-(10/2)
>The value of result is 67

 

>expression (x+y)*z-a/b x=10 y=20 z=5 a=10 b=2
>The value of result is 145

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,下面是使用lexyacc制作一个算术计算器的步骤: 1. 定义词法分析 使用lex工具定义词法分析,即将输入的字符串分解为一个个符号(token),并将其传递给语法分析yacc)。在这个例子中,我们需要定义数字、加号、减号、乘号、除号以及左右括号等符号。 下面是一个简单的词法分析的例子: ``` %{ #include "y.tab.h" %} %% [0-9]+ { yylval = atoi(yytext); return NUMBER; } "+" { return PLUS; } "-" { return MINUS; } "*" { return TIMES; } "/" { return DIVIDE; } "(" { return LPAREN; } ")" { return RPAREN; } [ \t] { /* ignore whitespace */ } \n { /* end of line */ } . { printf("invalid input\n"); } %% int yywrap() { return 1; } ``` 2. 定义语法分析 使用yacc工具定义语法分析,即定义输入符号串的语法规则,并生成可执行的语法分析。在这个例子中,我们需要定义算术达式的语法规则,例如加法、减法、乘法、除法以及括号等。 下面是一个简单的语法分析的例子: ``` %{ #include <stdio.h> #include <stdlib.h> %} %token NUMBER PLUS MINUS TIMES DIVIDE LPAREN RPAREN %% input: /* empty */ | input line line: exp '\n' { printf("= %d\n", $1); } exp: exp PLUS exp { $$ = $1 + $3; } | exp MINUS exp { $$ = $1 - $3; } | exp TIMES exp { $$ = $1 * $3; } | exp DIVIDE exp { $$ = $1 / $3; } | LPAREN exp RPAREN { $$ = $2; } | NUMBER { $$ = $1; } ; %% int main() { yyparse(); return 0; } int yyerror(char *s) { fprintf(stderr, "error: %s\n", s); return 0; } ``` 3. 编译和运行 使用以下命令编译并运行程序: ``` $ lex calc.l $ yacc -d calc.y $ gcc lex.yy.c y.tab.c -o calc $ ./calc ``` 之后就可以输入算术达式并得到计算结果了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值