Lex与Yacc学习(八)之变量和有类型的标记(扩展计算器)
2024-09-30 04:38:46
变量和有类型的标记
下一步扩展计算器来处理具有单个字母名字的变量,因为只有26个字母 (目前只关心小写字母),所以我们能在26个条目的数组(称它为vbltable)中存储变量。
为了使得计算器更加有用,也可以扩展它来处理多个表达式(每行一个)和使用浮点值。
具有变量和实值的计算器词法ch3-03.l
%{
#include "ch3-03.tab.h"
#include <math.h>
extern double vbltable[26];
%}
%%
([0-9]+|([0-9]*\.[0-9]+)([eE][-+]?[0-9]+)?) {
yylval.dval = atof(yytext);
return NUMBER;
}
[ \t] ; /*忽略空白*/
[a-z] { yylval.vblno = yytext[0] - 'a';
return NAME;
}
"$" { return 0; /*输入结束*/ }
\n |
. return yytext[0];
%%
具有变量和实值的计算器语法ch3-03.y
%{
double vbltable[26];
%} %union {
double dval;
int vblno;
}
%token <vblno> NAME
%token <dval> NUMBER
%left '-' '+'
%left '*' '/'
%nonassoc UMINUS %type <dval> expression %%
statement_list: statement '\n'
| statement_list statement '\n'
statement: NAME '=' expression {vbltable[$1] = $3; }
| expression { printf("= %g\n", $1); }
; expression: expression '+' expression { $$ = $1 + $3; }
| expression '-' expression { $$ = $1 - $3; }
| expression '*' expression { $$ = $1 * $3; }
| expression '/' expression
{
if($3 == 0.0)
yyerror("divide by zero");
else
$$ = $1 / $3;
}
| '-' expression %prec UMINUS {$$ = -$2;}
| '(' expression ')' {$$ = $2; }
| NUMBER { $$ = $1; }
| NAME { $$ = vbltable[$1]; }
;
%% int main()
{
yyparse();
return 0;
} int yyerror(char *s)
{
printf("%s\n",s);
return 0;
}
编译运行结果
最新文章
- 理解Session与Cookie
- 这种代码怎么改写?以致于在下次增加CustomsType时,不需要再加 if 语句。
- 矩阵分解ALS方法
- 攻城狮在路上(肆)How tomcat works(三) 连接器:Connector
- python代码风格-PEP8
- 将EXCEL数据表导入到SQL中
- 了解magento数据库
- 【BZOJ2049】【LCT】Cave 洞穴勘测
- [转]在ITunes播放中前进、后退五秒的快捷键
- sql server存储过程分页
- 标准I/O库函数的缺陷
- Linkedin工程师是如何优化他们的Java代码的(转)
- Linux 初设root 密码
- 引水入城[NOI2010 ]
- 如何透彻分析Java开发人员
- Shell中处理方法返回值问题
- 2018/1/28 每日一学 单源最短路的SPFA算法以及其他三大最短路算法比较总结
- IT轮子系列(三)——如何显示方法名——Swagger的使用(三)
- Golang的md5 hash计算
- 利用ImageJ快速调整连续切片的对比度
热门文章
- bryce1010专题训练——CDQ分治
- Java EE学习笔记(三)
- 自己写一个轻量的JqueryGrid组件
- CSS3在hover下的几种效果
- Nacos部署中的一些常见问题汇总
- .NET Core 1.0 CentOS7 尝试(一、安装)
- 学习php中的mysql()函数
- GetDC(),ReleaseDC()
- 【春节版】年度精品 XP,32/64位Win7,32/64位Win8,32/64位Win10系统
- ubuntu 16.0 利用ant编译 hadoop-eclipse-plugins2.6.0