一、实验要求

运用YACC,针对TINY语言,构造一个语法分析器。给出实验方案,实施并描述结果。

二、实验方案

(1)设计基于LEX的TINY词法分析器

(2)设计基于YACC的TINY语法分析器

(3)同时使用词法分析器和语法分析器分析calculator文法

三、分析表parsing table问题

理论和设计

分析表的作用:对当前非终极符和输入符号确定应该选择用哪个产生式进行推导。

四、内容和步骤

1、针对TINY语言给出 yacc的y文件的代码

%{#include <ctype.h>
#include<stdio.h>
#define MSDOS
int linecount;
extern int yylex();
extern int yyerror();
%}
%union{char chr;char *str;int integer;float real;double dbl;}
%token number
%type <real> expr number
%left '+' '-'
%left '*' '/'
%right uminus
%%
lines: lines expr'\n'{printf("line %d:%g\n",linecount++,$2);}|lines'\n'{linecount++;}|;
expr:   expr'+'expr{$$=$1+$3;}|expr '-' expr{$$=$1-$3;}|expr '*' expr{$$=$1*$3;}| expr '/' expr{$$=$1/$3;}| '(' expr ')'{$$=$2;}| '-' expr %prec uminus{$$=-$2;}| number;
%%
int yyerror(s)
char *s;
{fprintf(stderr,"syntactic error:%s\n",s);return 0;
}

2、给出.l文件的代码

%{
#include <ctype.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#define false 0
#define ture 1
#include "yacc.tab.h"
extern int lexverbose;
extern int linecount;
%}
digit [0-9]
letter [a-zA-Z]
%%
{digit}+   {yylval.real=(float)atof(yytext);if(lexverbose)printf("real:%g\n",yylval.real);return(number);}
\+   {yylval.chr=yytext[0];if(lexverbose)printf("opterator:%c\n",yylval.chr);return('+');}
\-   {yylval.chr=yytext[0];if(lexverbose)printf("oprator:%c\n",yylval.chr);return('-');}
\*   {yylval.chr=yytext[0];if(lexverbose)printf("oprator:%c\n",yylval.chr);return('*');}
\/   {yylval.chr=yytext[0];if(lexverbose)printf("oprator:%c\n",yylval.chr);return('/');}
"("   {yylval.chr=yytext[0];if(lexverbose)printf("separator:%c\n",yylval.chr);return('(');}
")"   {yylval.chr=yytext[0];if(lexverbose)printf("separtor:%c\n",yylval.chr);return(')');}
;   {return(';');}
\n   {printf("line %d\n",linecount);/*  linecount++;     */return('\n');}
[ \t]+                  {printf("lexical analyzer error\n");}
quit  {printf("Bye!\n");exit(0);}
%%
int yywrap()
{
return(1);
}

3、实验具体步骤

main

#include"lex.yy.c"
#include"yacc.tab.c"
#include <stdlib.h>
#include <stdio.h>
int lexverbose=1;
extern int yyparse();int main(int argc, char* argv[])
{extern FILE *yyin;printf("Compiling...!\n");if((yyin=fopen("test.c","rt"))==NULL){perror("can not open file test.txt\n") ;exit(1);}if (yyparse()==1){fprintf(stderr,"parser error\n");exit(1);}printf("yyparse() completed successfully!\n");return 0;
}

编译

root@LAPTOP-7ASLMDHA:~# bison yacc -d
root@LAPTOP-7ASLMDHA:~# lex lex
root@LAPTOP-7ASLMDHA:~# gcc -o parser main.c
root@LAPTOP-7ASLMDHA:~# ./parser
Compiling...!
real:2
opterator:+
real:1
oprator:*
real:3
line 0
line 0:5
real:1
opterator:+
real:1
line 1
line 1:2
yyparse() completed successfully!

test

2+1*3
1+1

五、实验结果

六、实验结论

1 、实验结论

(1)lex可以生成一个词法分析器

(2)yacc生成的编译器主要是用C语言写成的语法解析器,需要与词法解析器Lex一起使用,再把两部份产生出来的C程序一并编译。

(3)词法分析器和语法分析器结合使用可以实现算术分析,构建分析表

2、分析和总结

高效、快捷

3、实验中出现的冲突及解决过程描述

(1)lex和yacc语法问题

解决方案:查阅参考文献

(2)yacc和lex生成顺序问题

解决方案:正确执行生成命令,和编译过程命令

参考文章

Windows下lex 与 yacc的使用

LEX和YACC的使用(例子)

Lex和Yacc应用方法(转)

基于YACC的TINY语法分析器的构建

《编译原理》实验报告——基于YACC的TINY语法分析器的构建相关推荐

  1. 编译原理——实验叁——基于YACC的TINY语法分析器的构建

    一. 实验要求 运用YACC,针对TINY语言,构造一个语法分析器.给出实验方案,实施并描述结果. 二. 实验方案 (1)设计基于YACC的TINY词法分析器 (2)设计基于LEX的TINY语法分析器 ...

  2. 编译原理——实验叁预习报告——基于YACC的TINY语法分析器的构建

    一.实验目的: 运用YACC,针对给定的文法,构造一个语法分析器.给出实验方案,实施并描述结果. 二.实验预习提示 1.表达:针对5.5节中的calculator文法,设计输入和输出 2.观察:观察p ...

  3. 《编译原理》实验预习报告——基于YACC的TINY语法分析器的构建

    一.实验目的 运用YACC,针对给定的文法,构造一个语法分析器.给出实验方案,实施并描述结果. 二.实验预习提示 1.表达:针对5.5节中的calculator文法,设计输入和输出 2.观察:观察pa ...

  4. 编译原理实验:Java实现SLR(1)语法分析器

    首先如果有熟悉Python的童鞋也可以看一看Python实现SLR(1)语法分析器,编译原理yyds!__FF_Y的博客-CSDN博客_python语法分析器,是我一个特别好的学长写的,这波属于传承了 ...

  5. html解析器编译原理,编译原理实验报告词法分析器(内含源代码).docx

    编译原理实验报告词法分析器(内含源代码) 编译原理实验(一) --词法分析器 实验描述 运行环境:vc++2008 对某特定语言A ,构造其词法规则. 该语言的单词符号包括: 1该程序能识别的单词符号 ...

  6. c语言词法分析器实验原理,词法分析器的设计与实现 编译原理实验报告.doc

    词法分析器的设计与实现 编译原理实验报告 中北大学软件学院 实 验 报 告 专 业 软件工程 课程名称 编译原理 学 号 姓 名 辅导教师 张静 成绩 实验日期2015.5.19实验时间14:00~1 ...

  7. 编译原理上机实习c语言小子集编译程序的实现报告,合肥工业大学编译原理实验报告(完整代码版)...

    <合肥工业大学编译原理实验报告(完整代码版)>由会员分享,可在线阅读,更多相关<合肥工业大学编译原理实验报告(完整代码版)(58页珍藏版)>请在人人文库网上搜索. 1.计算机与 ...

  8. 编译原理实验报告:词法分析

    NCWU慎用 1.实验要求 (1)从源程序文件中读取有效字符流并将其分析识别单词符号,转换成二元组内部表示形式输出. (2)可视化方式展示词法分析识别过程或者词法分析器工作原理(选做). (3)实验时 ...

  9. 编译原理实验报告一:PL0语言编译器分析(PL0,词法分析,语法分析,中间代码生成)

    实验报告一:PL0语言编译器分析 一.实验目的 通过阅读与解析一个实际编译器(PL/0语言编译器)的源代码, 加深对编译阶段(包括词法分析.语法分析.语义分析.中间代码生成等)和编译系统软件结构的理解 ...

最新文章

  1. Spring BeanDefinitionRegistryPostProcessor BeanPostProcessor作用
  2. 华为pat地址转换,以及内网web服务器发布
  3. 原创:QQ群发言统计
  4. 图解用NetCat连接远程端口
  5. Linux┊详解udev
  6. AutoCAD.net Transaction实例4 标高
  7. 3DLC系列之:2D 曲线面板
  8. 已知三角形底和高用c语言,三角形面积公式有哪些 如何求三角形面积
  9. Python用socket、多线程实现一对一聊天室
  10. 数仓工具hive概述
  11. 物联网常见概念总结(期末复习)
  12. QCA三天写论文!清晰集分析实战
  13. 如何通过console线缆本地连接网络设备的路由器或交换机进行配置
  14. 方差、标准差、均方误差的总结
  15. MyCat-web 可视化运维管理和监控平台
  16. c++海盗战争1.0正式版【免费复制】
  17. 应届生简历怎么写?应届生制作简历注意事项有哪些?
  18. HMS Core 6.8.0版本发布公告
  19. phpstorm ftp连不上 flashfxp 显示 PORT 模式连接成功
  20. PEKS关键词可搜索加密详解

热门文章

  1. C# 函数重载 示例 求圆的面积
  2. java框内的值怎么同步_java并发编程使用锁进行数据同步操作一
  3. python pipeline框架_介绍Python的Django框架中的静态资源管理器django-pipeline
  4. 100w氮化镓充电器_SHARGE闪极-100W大功率氮化镓充电器体验
  5. flink 4-输出
  6. linux ps1 目录颜色,Linux下PS1终端下的颜色设置
  7. java io 结构_java 的IO类库的基本架构
  8. mysql 数据泵导入导出_【Oracle篇】约束和数据泵导入导出
  9. word图片自动换行不亮_知网查重时提交pdf检测结果竟然比Word高很多!
  10. Java使用Proxy和CGLib实现动态代理