变量和有类型的标记

下一步扩展计算器来处理具有单个字母名字的变量,因为只有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;
}

编译运行结果

最新文章

  1. 理解Session与Cookie
  2. 这种代码怎么改写?以致于在下次增加CustomsType时,不需要再加 if 语句。
  3. 矩阵分解ALS方法
  4. 攻城狮在路上(肆)How tomcat works(三) 连接器:Connector
  5. python代码风格-PEP8
  6. 将EXCEL数据表导入到SQL中
  7. 了解magento数据库
  8. 【BZOJ2049】【LCT】Cave 洞穴勘测
  9. [转]在ITunes播放中前进、后退五秒的快捷键
  10. sql server存储过程分页
  11. 标准I/O库函数的缺陷
  12. Linkedin工程师是如何优化他们的Java代码的(转)
  13. Linux 初设root 密码
  14. 引水入城[NOI2010 ]
  15. 如何透彻分析Java开发人员
  16. Shell中处理方法返回值问题
  17. 2018/1/28 每日一学 单源最短路的SPFA算法以及其他三大最短路算法比较总结
  18. IT轮子系列(三)——如何显示方法名——Swagger的使用(三)
  19. Golang的md5 hash计算
  20. 利用ImageJ快速调整连续切片的对比度

热门文章

  1. bryce1010专题训练——CDQ分治
  2. Java EE学习笔记(三)
  3. 自己写一个轻量的JqueryGrid组件
  4. CSS3在hover下的几种效果
  5. Nacos部署中的一些常见问题汇总
  6. .NET Core 1.0 CentOS7 尝试(一、安装)
  7. 学习php中的mysql()函数
  8. GetDC(),ReleaseDC()
  9. 【春节版】年度精品 XP,32/64位Win7,32/64位Win8,32/64位Win10系统
  10. ubuntu 16.0 利用ant编译 hadoop-eclipse-plugins2.6.0