语法分析器设计实验报告_第1页
语法分析器设计实验报告_第2页
语法分析器设计实验报告_第3页
语法分析器设计实验报告_第4页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、语法分析器设计实验报告 学 学 号 编译原理 实验2:语法分析器设计 学 生 姓 名 专 业 、 班 级 指 导 教 师 赵璐 成 绩 计算机与信息工程学院 2021 年 11 月 27 日 一、实验目的 1. 理解语法分析程序的功能。 2. 熟悉语法分析程序的设计原理和构造方法。 3. 掌握递归下降语法分析程序的构造方法。 4. 设计一个递归下降的语法分析器,作为实验一构造的词法分析器的下一步编译工具,能语法分析前一步词法分析器输出的单词符号序列。 二、实验要求 1. 根据书 p206 给出的简单语言的语法规则,编写 c 或 c+语言源程序,实现针对该简单语言的递归下降的语法分析器; 2.

2、独立做实验,输入、调试所编程序; 3. 实验结束后,根据实验报告模板编写实验报告。 三、实验内容和步骤 用 visual c+作为实验开发环境,创建一个 win32 console application 工程,工程名为你的学号,添加三个文件: (1)存储结构定义:以 parserdef.h 和 lexerdef.h 为文件名; (2)基本操作的算法:以 parseralgo.h 和 lexeralgo.h 为文件名; (3)调用基本操作的主程序:以 parsermain.cpp 为文件名。 编写程序: (1)文件 lexerdef.h 和 lexeralgo.h 为实验一的内容。 (2)文件

3、 parserdef.h 定义语法分析所需的全局变量等。 (3)文件 parseralgo.h 实现对语法规则中各语法成分的分析子算法。 (4)文件 parsermain.cpp 实现针对 p206 简单语言语法规则的递归下降语法分析器。 源程序代码: : =parserdef.h= int kk; #define _key_word_end waiting for your expanding char * rwtab=begin,if,then,while,do,end,_key_word_end; char input255; char token255=; int p_input; i

4、nt p_token; char ch; =parseralgo.h= char prog80; int syn,p,m,n,sum=0; void scaner() m=0; for(n=0; n8; n+) tokenn=null; ch=progp+; while(ch=" ") ch=progp+; if(ch="a" ch="z") |(ch="a" ch="z") while(ch="a" ch="z") |(ch="a"

5、ch="z")|(ch="0" ch="9") tokenm+=ch; ch=progp+; tokenm+="0" syn=10; p=p-1; /回退一个字符 for(n=0; n6; n+) if(strcmp(token,rwtabn)=0) syn=n+1; break; else if(ch="0" ch="9") sum=0; while(ch="0" ch="9") sum=sum*10+ch-"0"

6、 ch=progp+; p=p-1; syn=11; else switch(ch) case "": m=0; tokenm+=ch; ch=progp; if(ch="") syn=21; tokenm+=ch; else if(ch="=") syn=22; tokenm+=ch; else syn=20; p=p-1; p=p+1; tokenm="0" break; case "": m=0; tokenm+=ch; ch=progp+; if(ch="=") sy

7、n=24; tokenm+=ch; else syn=23; p=p-1; break; case ":": m=0; tokenm+=ch; ch=progp+; if(ch="=") syn=18; tokenm+=ch; else syn=17; p=p-1; break; case "+": syn=13; token0=ch; break; case "-": syn=14; token0=ch; break; case "*": syn=15; token0=ch; break; c

8、ase "/": syn=16; token0=ch; break; case "": syn=26; token0=ch; break; case "(": syn=27; token0=ch; break; case ")": syn=28; token0=ch; break; case "=": syn=25; token0=ch; break; case "#": syn=0; token0=ch; break; default: syn=-1; =parsermai

9、n.cpp= #includestdio.h #includestdlib.h #includestring.h #includelexerdef.h #includeparserdef.h #includelexeralgo.h #includeparseralgo.h void lrparser(); void yucu(); void statement(); void expression(); void term(); void factor(); void lrparser() if (syn=1) /begin scaner(); yucu(); if (syn=6) /end

10、scaner(); if (syn=0 kk=0) printf(success n); else if(kk!=1) printf(error,lose "end" ! n); kk=1; else printf(error,lose "begin" ! n); kk=1; return; void yucu() statement(); while(syn=26) scaner(); statement(); return; void statement() if (syn=10) /为标识符 scaner(); if (syn=18) /为 :=

11、scaner(); expression(); else printf(error!); kk=1; else printf(error!); kk=1; return; void expression() term(); while(syn=13 | syn=14) scaner(); term(); return; void term() factor(); while(syn=15 | syn=16) scaner(); factor(); return; void factor() if(syn=10 | syn=11)scaner(); /为标识符或整常数时,读下一个单词符号 els

12、e if(syn=27) scaner(); expression(); if(syn=28)scaner(); else printf( ")" 错误n); kk=1; else printf(表达式错误n); kk=1; return; void main() p=0; printf(*语法分析程序*n); printf(请输入源程序:n); do scanf(%c,ch); progp+=ch; while(ch!="#"); p=0; scaner(); lrparser(); printf(语法分析结束!n); 四、解答下列问题 (1)简述该语法分析器的算法思想。 (2)用右递归的上下文无关文法描述 p206 给出的简单语言的语法规则(书上用扩充的 bnf表示法描述),简化各语法成分成如下符号:程序p、语句串y、语句a、赋值语句s、表达式e、项t、因子f 。 (3)解释程序变量 kk 的作用、可能取值及对应含义。 五、实验结果 针对输入的源程序,经语法分析后,给出实验结果截图。 (1)源

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论