符号表

上一篇的计算器程序中的变量名只支持单个字符(a-z), 很少有用户满意单字符变量名,所以现在要增加使用较长变量名的能力。这意味着需要一个符号表——一种用来跟踪使用中的名字的结构。每次记法分析程序读取输入中的名字时,它都在符号表中查找这个名字,并且得到一个对应符号表条目的指针。在程序的其它地方,使用符号表指针而不是名字串,因为每次需要时指针比查找名字更快速更容易。

因为符号表要求语法分析程序和词法分析程序共享的数据结构,所以我们创建一个头文件ch3hdr.h:

$ vi ch3hdr.h #define NSYMS 20        /* maximum number of symbols */struct symtab {char *name;double value;
}symtab[NSYMS];struct symtab *symlook(char *s);

这个符号表是一个结构体数组,每个结构都包含变量的名字和它的数值。我们还声明一个符号表查找程序symlook(),它以文本字符串形式的名字为参数,顺序地搜索字符表来寻找与传入参数名字对应的条目。如果某条目的name与symlook正在搜索的字符串匹配,就返回该条目的指针,因为名字已进被放进了表中。如果name字段为空,并且已经寻找了符号表中的所有条目且所有找到匹配的条目,那么我们就把名字输入至今为止还是空的符号表条目中。

具有符号表的语法分析程序ch3-4.y

%{#include "stdio.h"
#include "ch3hdr.h"
#include <string.h>
%}%union {double  dval;struct symtab *symp;
}%token <symp> NAME
%token <dval> NUMBER
%left '-' '+'
%left '*' '/'
%nonassoc UMINUS%type <dval> expression%%
statement_list: statement '\n'|       statement_list statement '\n'statement:      NAME '=' expression     { $1->value=$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("divided by zero.\n");else$$=$1 / $3;}|       '-' expression %prec UMINUS     { $$ = -$2; }|       '(' expression ')'              { $$ = $2; }|       NUMBER                          { $$ = $1; }|       NAME                            { $$ = $1->value; }%%int main(){yyparse();return 0;
}void yyerror(char *s){fprintf(stderr,"%s\n",s);
}

具有符号表的词法分析程序ch3-4.l

%{#include "y.tab.h"
#include "ch3hdr.h"
#include <math.h>
#undef yywrap
%}%%
([0-9]+|([0-9]*\.[0-9]+)([eE][-+]?[0-9]+)?)     {yylval.dval = atof(yytext);return NUMBER;}
[ \t] ;
[A-Za-z][A-Za-z0-9]*    {yylval.symp=symlook(yytext);return NAME;}
"$"     { return 0; }
\n      |
.       return yytext[0];
%%int yywrap()
{return 1;
}struct symtab *
symlook(char *s){char *p;struct symtab *sp;for(sp=symtab;sp<&symtab[NSYMS];sp++){if(sp->name && !strcmp(sp->name,s))return sp;if(!sp->name){sp->name=strdup(s);return sp;}}yyerror("Too many symbols.");exit(1);
}

编译和运行:

[postgre@host132 ch3]$ yacc -d ch3-4.y
[postgre@host132 ch3]$ lex ch3-4.l
[postgre@host132 ch3]$ cc -o test lex.yy.c y.tab.c
[postgre@host132 ch3]$ ./test
foo=23
foo/5
=4.6
abc=34
3*abc
=102
$
[postgre@host132 ch3]$

yacc学习笔记(四)带符号表的计算器程序相关推荐

  1. mysql新增表字段回滚_MySql学习笔记四

    MySql学习笔记四 5.3.数据类型 数值型 整型 小数 定点数 浮点数 字符型 较短的文本:char, varchar 较长的文本:text, blob(较长的二进制数据) 日期型 原则:所选择类 ...

  2. JavaScript学习笔记(四)(DOM)

    JavaScript学习笔记(四) DOM 一.DOM概述 二.元素对象 2.1 获取方式 (1).通过ID获取一个元素对象,如果没有返回null (2).通过`标签名`获取一组元素对象,,如果没有返 ...

  3. MySQL高级学习笔记(四)

    文章目录 MySQL高级学习笔记(四) 1. MySql中常用工具 1.1 mysql 1.1.1 连接选项 1.1.2 执行选项 1.2 mysqladmin 1.3 mysqlbinlog 1.4 ...

  4. C#可扩展编程之MEF学习笔记(四):见证奇迹的时刻

    前面三篇讲了MEF的基础和基本到导入导出方法,下面就是见证MEF真正魅力所在的时刻.如果没有看过前面的文章,请到我的博客首页查看. 前面我们都是在一个项目中写了一个类来测试的,但实际开发中,我们往往要 ...

  5. IOS学习笔记(四)之UITextField和UITextView控件学习

    IOS学习笔记(四)之UITextField和UITextView控件学习(博客地址:http://blog.csdn.net/developer_jiangqq) Author:hmjiangqq ...

  6. RabbitMQ学习笔记四:RabbitMQ命令(附疑难问题解决)

    RabbitMQ学习笔记四:RabbitMQ命令(附疑难问题解决) 参考文章: (1)RabbitMQ学习笔记四:RabbitMQ命令(附疑难问题解决) (2)https://www.cnblogs. ...

  7. JSP学习笔记(四十九):抛弃POI,使用iText生成Word文档

    POI操作excel的确很优秀,操作word的功能却不敢令人恭维.我们可以利用iText生成rtf文档,扩展名使用doc即可. 使用iText生成rtf,除了iText的包外,还需要额外的一个支持rt ...

  8. Ethernet/IP 学习笔记四

    Ethernet/IP 学习笔记四 EtherNet/IP Quick Start for Vendors Handbook (PUB213R0): https://www.odva.org/Port ...

  9. HTML/CSS学习笔记02【表单标签】

    w3cschool菜鸟教程.CHM(腾讯微云):https://share.weiyun.com/c1FaX6ZD HTML/CSS学习笔记01[概念介绍.基本标签.表单标签][day01] HTML ...

最新文章

  1. 批处理-批量拉取git代码
  2. ThinkPHP 数据库表结构处理类(简单实用)
  3. jzoj3508-好元素【hash,优雅的暴力】
  4. Barra 结构化风险模型实现(1)——沪深300指数的风格因子暴露度分析
  5. Carrot2 in action 初步印象
  6. 在matlab上利用fft进行信号频谱分析_全面分析:频谱分析仪原理技术(收藏必备)...
  7. ESP8266获取B站粉丝数
  8. 基于Revel+Layui框架快速入门教程
  9. <video> 标签快进不生效
  10. 如何将几个pdf合并成一个pdf?教你pdf合并最快速的方法
  11. android打开蓝牙设置界面,Android 点击跳转到蓝牙设置界面
  12. mac终端Login Incorrect问题
  13. 面试文案策划要准备一些什么?
  14. 整数二分详解---yxc
  15. java异常之-ClassNotFoundException: .......web.context.ContextLoaderServlet
  16. echarts模拟迁徙图
  17. 【第22章】网站安全需求分析与安全保护工程 (软考:信息安全工程师)--学习笔记
  18. sql inject1
  19. SQLAlchemy Datetime 和 TIMESTAMP
  20. 抖音0播放至10万播放的正确方式,新号如何不投DOU+也能冷启动?

热门文章

  1. 如何上传图片裁剪(2种方法)
  2. 安装升级包卡住了华为_华为手机升级EMUI9.1时提示“安装包验证失败”如何解决?...
  3. JS: json字符串如何转换成对象
  4. Flask博客开发实战-用户中心实现修改个人信息功能
  5. 敷完面膜后要擦水乳吗_敷完面膜后还要擦水乳吗
  6. (超全,超经典)scanf()函数与printf()中的格式说明符
  7. datetemp oracle 转秒数_user用户AppDate\Local\Temp文件恶性增长,直到撑爆磁盘
  8. linux设置壁纸命令,桌面应用|使用一个命令重置 Linux 桌面为默认设置
  9. NSError错误码解读
  10. cpu风扇等其他电脑上风扇的消除噪音方法教程介绍示范