




已阅读5页,还剩28页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
编译原理实验报告课 程 实 验 报 告课程名称: 编译原理:词法和语法分析专业班级: 信息安全1302班 学 号: 姓 名: 指导教师: 报告日期: 2013年11月4号 计算机科学与技术学院1、 实验目的设计,编制并调试一个词法分析程序,加深对词法分析原理的理解2、实验要求2.1 待分析的简单语言的词法(1) 关键字:begin if then while do end 所有的关键字都是小写。(2) 运算符和界符:: = + - * / = = = ; ( ) #(3) 其他单词是标识符(ID)和整型常数(NUM),通过以下正规式定义:ID = letter ( letter | digit )*NUM = digit digit*(4) 空格由空白、制表符和换行符组成。空格一般用来分隔ID、NUM、运算符、界符和关键字,词法分析阶段通常被忽略。2.2 各种单词符号对应的种别码单词符号种别码单词符号种别码begin1:17if2: =18then320while421do523letter ( letter | digit )*10 =24digit digit*11=25+13;26-14(27*15)28/16#02.3 词法分析程序的功能输入:所给文法的源程序字符串。输出:二元组(syn,token或sum)构成的序列。其中:syn为单词种别码;token为存放的单词自身字符串;sum为整型常数例如:对源程序 begin x: = 9 ; if x 0 : then x: = 2*x+1/3; end # 的源文件,经词法分析后输出如下序列:(1, begin)(10,x)(18,:=)(11,9)(26,;)(2,if)3、词法分析程序的算法思 算法的基本任务是字符串表示的源程序中识别处具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字种类,拼出相应的单词符号。3.1 主程序示意图主程序示意图如图1所示,其中初值包括如下两个方面。(1) 关键字表的初值关键字作为特殊标识符处理,把它们预先安排在一张表格中(称为关键字表),当扫描程序识别出标识符时,查关键字表。如能查到匹配的单词,则该单词为关键字,否则为一般标识符。关键字表为一个字符串数组,其描述如下:Char * rwtab6 = “begin”,”if”,”then”,”while”,”do”,”end”;(2) 程序中需要用到的主要变量为syn,token,和sum。3.2 扫描子程序的算法思想首先设置3个变量:1.token用来存放构成单词符号的字符串;2.sum用来存放整型单词;3.syn用来存放单词符号的种别码。扫描子程序的主要流程图如图所示:4、实验结果1. 输入begin x:=9; if x 0 then x: = 2 * x + 1/3; end # 结果如下2. 输入begin a=9 end # 结果如下5、实验感想及总结本次实验主要是针对词法进行分析,让我对于词法分析的理论基础有了更深刻的认知。词法分析程序的功能是从左到右扫描源程序字符串,根据语言的词法规则识别出各类单词符号,并以二元组(单词种别,单词自身值)的形式输出。在课程上主要是理解了词法分析的作用以及其工作的原理,对于其具体的实现还不是很清楚,在本次实验中自己对于词法程序的编写是我将理论与实际相结合,对于具体的输入输出都有了很深刻的概念。但是在实验中也存在一些不足,比如,这只是针对其中一组关键字来实现的,如果换一组关键字,则需要重新编写程序。然而,LEX词法生成器能够很方便的实现,对此可以进行改进,“实践是检验真理的唯一标准”,对此我们应该谨记,从而继续对于实验中的不足进行改进。6、源代码#include#include#include#define KEY_WORD_END waiting for your expanding /*定义关键字结束标识符*/typedef struct /*单词二元组的结构*/ int syn; char* word;WORD;char input255; /*输入缓冲区*/char token255=; /*单词缓冲区*/int p_input; /*输入缓冲区指针*/int p_token; /*单词缓冲区指针*/char ch; /*当前读入字符*/const char* Keyword=begin,if,then,while,do,end,KEY_WORD_END; /*可扩充关键字数组*/char m_getch();void getbc();void concat();int letter();int digit();int reserve();void retract();char m_getch() /*从输入缓冲区读取一个字符到ch*/ ch=inputp_input; p_input=p_input+1; return (ch);void getbc() /*去掉空白符号*/ while(ch= |ch=10) ch=inputp_input; p_input=p_input+1; void concat() /*拼接单词*/ tokenp_token=ch; p_token=p_token+1; tokenp_token=0;int letter() /*判断是否是字母*/ if(ch=a&ch=A&ch=0&chsyn=10; myword-word=; p_token=0; m_getch(); getbc(); if(letter() while(letter()|digit() concat(); m_getch(); retract(); myword-syn=reserve(); myword-word=token; return(myword); else if(digit() while(digit() concat(); m_getch(); retract(); myword-syn=20; myword-word=token; return(myword); else switch(ch) case =:m_getch(); if(ch=) myword-syn=39; myword-word=; return(myword); retract(); myword-syn=21; myword-word=; return(myword); break; case +:myword-syn=22; myword-word=+; return(myword); break; case -:myword-syn=23; myword-word=-; return(myword); break; case *:myword-syn=24; myword-word=*; return(myword); break; case /:myword-syn=25; myword-word=/; break; case (:myword-syn=26; myword-word=(; return(myword); break; case ):myword-syn=27; myword-word=); return(myword); break; case :myword-syn=28; myword-word=; return(myword); break; case :myword-syn=29; myword-word=; return(myword); break; case :myword-syn=30; myword-word=; return(myword); break; case :myword-syn=31; myword-word=; return(myword); break; case ,:myword-syn=32; myword-word=,; return(myword); break; case :myword-syn=33; myword-word=:; return(myword); break; case ;:myword-syn=34; myword-word=; return(myword); break; case :m_getch(); if(ch=) myword-syn=37; myword-word=; return(myword); retract(); myword-syn=35; myword-word=; return(myword); break; case syn=38; myword-word=syn=36; myword-word=syn=40; myword-word=!=; return(myword); retract(); myword-syn=-1; myword-word=ERROR; return(myword); break; case 0:myword-syn=1000; myword-word=OVER; return(myword); break; default: myword-syn=-1; myword-word=ERROR; return(myword); int main() int over=1; WORD* oneword=new WORD; printf(Enter Your words(end with #):n); scanf(%#s,input);/*读入源程序字符串到缓冲区,以 # 结束,允许多行输入*/ p_input=0; printf(Your words:n%sn,input); while(oversynsyn,oneword-word); /*打印种别码和单词本身的值*/ over=oneword-syn; printf(npress # to exit:); scanf(%#s,input); /*按 # 退出程序*/ return 0;1、实验目的1) 设计并编制一个语法分析程序,加深对语法分析程序中递归下降分析方法的理解;2) 巩固对代码生成及报错处理等理论的认识;3) 培养对完整系统独立分析和设计的能力;4) 培养学生独立编程的能力;2、实验要求利用C语言编制递归下降分析程序,并对简单语言进行语法分析。2.1 待分析的简单语法的语法用扩充的BNF表示如下:(1) :=begin end(2) :=:语句(3) :=(4) :=ID := (5) :=+|-(6) :=*|/(7) :=ID | NUM | ( )2.2 语法分析程序的功能输入单词串,以”#”结束,如果是文法正确的句子,则输出成功信息,打印“success”,否则输出”error”例如: 输入: begin a:=9;b:=0 end #输出: success输入: begin a=9 end # 输出: error3、语法分析程序的算法思想算法的基本任务是从字符串中表示的源程序中识别出具有独立意义的单词符号,并通过其基本文法,正确规约到开始符号。 3.1 全局变量的设置 在此程序中,需要设置两个个全局变量: 关键字表retab6、当前识别的种别号syn。 其中retab中元素为 “begin” “if” “then” “while” “do” “end”,在程序会扫描出标识符时,首先查关键字表。如果能找到匹配的单词,则该单词为关键字,否则为一般标识符。syn用于每一步扫描中scanner 的返回值。在整个语法分析程序中均需要使用该全局变量。3.2 主程序main算法流程图3.3 扫描子程序scanner()的算法流程图3.4 递归下降分析程序示意图3.5 语句串分析程序yucu()的算法流程图3.6 statement语句分析算法流程图3.7 expression表达式分析算法流程图3.8 term分析函数算法流程图3.9 factor分析函数算法流程图4、实验结果3. 输入begin a:=9; x:= 2*3 end # 结果如下4. 输入begin a=9 end # 结果如下5、实验感想及总结本次实验是进行语法分析实验,编制了一个递归下降分析程序,实现了对语法分析程序所提供的单词序列的语法检查和结构分析。通过本次实验深刻了解了语法分析程序的功能是以词法分析器生成的单词符号序列作为输入,根据语言的语法规则,识别出各种语法成分,并在分析过程中进行语法检查,检查所给单词符号序列是否是该语言的文法的一个句子。若是,则以该句子的某种形式的语法树作为输出;若不是,则表明有错误,并指出错误的性质和位置。在实验中,只是按照课本所给的程序框架来进行代码编写是不能深刻理解语法分析的,对此我深有体会,所以一定要理解其真正的思想,才能够明白具体实现的目的以及意义,在实验中海油可以改进的地方,比如,可以使用yacc语法分析器来进行语法分析,这种方式比直接编写程序更加简洁方便,并且能够处理不同的生成的单词符号。6、源代码#include #include#include#includechar GetChar(char *input,int *index,int length);int ClearBlank(char *input,int (*index),int length);int reserve(char *s);void lrparser(char *input,int inputLength,int *index);void yucu(char *input,int inputLength,int *index);void factor(char *input,int inputLength,int *index);void statement(char *input,int inputLength,int *index);void expression(char *input,int inputLength,int *index);void term(char *input,int inputLength,int *index);const char *retab6= begin,if,then,while,do,end; /关键字int syn=0;int myIsAlpha(char ch) if(islower(ch)=2 | isupper(ch)=1) return 1; else return 0; void scaner(char *input,int inputLength,int *index) char s256=; /保存当前的字符 char ch=GetChar(input,index,inputLength); int nowPosition=0; int j=0; if(myIsAlpha(ch)=1) /如果是字母 while(ch=0 & ch=9) | (myIsAlpha(ch)=1 ) )& *index =inputLength) snowPosition=ch; /添加到当前字符串中 nowPosition+; ch=GetChar(input,index,inputLength); if(ch 9) &(myIsAlpha(ch)=0 ) )/进行回退操作,并输出结果 snowPosition=0;/添加结束标志 j=reserve(s); if(j=0) syn=10; else syn=j; (*index)-; return; else /超过范围 snowPosition+=ch; snowPosition=0;/添加结束标志 j=reserve(s); if(j=0) syn=10; else syn=j; getchar(); exit(0); return; else if(ch=0 & ch=0 & ch=9& *index =inputLength) snowPosition=ch; /添加到当前字符串中 nowPosition+; ch=GetChar(input,index,inputLength); if(ch9)/进行回退操作 (*index)-; syn=11; return; else /超过范围时 snowPosition=ch; syn=11; return; else switch(ch) case +: syn=13; return; case -: syn=14; return ; case *: syn=15; return ; case /: syn=16; return ; case ) syn=21; return ; else syn=20; if(*indexinputLength) return; else (*index)-; return ; case : ch=GetChar(input,index,inputLength); if(ch=) syn=24; return ; else syn=23; if(*indexinputLength) return; else (*index)-; return ; case : ch=GetChar(input,index,inputLength); if(ch=) syn=18; return ; else if(*indexinputLength) return; else (*index)-; return ; case =: syn=25; return ; case ;: syn=26; return ; case (: syn=27; return ; case ): syn=28; return ; case #: syn=0; return ; case : syn=-1; return ; default: printf(非法符号); int reserve(char *s) if(strcmp(s,retab0)=0) return 1; else if(strcmp(s,retab1)=0) return 2; else if(strcmp(s,retab2)=0) return 3; else if(strcmp(s,retab3)=0) return 4; else if(strcmp(s,retab4)=0) return 5; else if(strcmp(s,retab5)=0) return 6; else return 0; char GetChar(char *input,int *index,int length) if(*index = length) (*index)+; return input(*index)-1; else return 0;int ClearBlank(char *input,int (*index),int length) while( (*index) != length) if(input(*index) =32 & (*index) != length) (*index)+; else if( input(*index) =32 & (*index) = length) printf(n谢谢使用!n); getchar(); exit(0); else return 1; return 0;void lrparser(char *input,int inputLength,int *index) if(syn=1) scaner(input,inputLength, index); while(syn=-1) scaner(input,inputLength, index); yucu(input,inputLength, index); if(syn = 6) scaner(input,inputLength, index); while(syn=-1) scaner(input,inputLength, index); if(syn=0 ) printf(successn); getchar(); return; else printf(error!); return; void yucu(char *input,int inputLength,int *index) statement(input,inputLength, index); while(syn=26) scaner(input,inputLength, index); while(syn=-1) scaner(input,inputLength, index); statement(input,inputLength, index); return ;void statement(char *input,int inputLength,int *index) if(syn =10) scaner(input,inputLength, index); while(syn=-1) scaner(input,inputLength, index); if(syn=18) scaner(input,inputLength, index); while(syn=-1) scaner(input,inputLength, index); expression(input,inputLength, index); else printf(输出赋值号错误!n); getchar(); exit(0); else printf(输出语句错误!%dn,syn); getchar(); exit(0); return ;void expression(char *input,int inputLength,int *index) term(input,inputLength, index); while(syn = 13| syn =14) scaner(input,inputLength, index); while(syn=-1) scaner(input,inputLength, index); term(input,inputLength, index ); return ;void term(char *input
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025合作协议委托合同样本
- 2025至2031年中国有机玻璃化妆品座行业投资前景及策略咨询研究报告
- 天津工艺美术职业学院《数据采集与清洗课程设计》2023-2024学年第二学期期末试卷
- 辽宁商贸职业学院《代码安全机制与实现技术》2023-2024学年第二学期期末试卷
- 深圳北理莫斯科大学《城市规划原理B》2023-2024学年第一学期期末试卷
- 《人力资源经理工作成果展示》课件
- 社区家长学校家庭教育
- 2025智能家居安防系统安装合同书
- 2025至2030年中国车载式LED电子显示屏数据监测研究报告
- 2025至2030年中国美式沾塑钢丝钳数据监测研究报告
- 2025建筑信息模型技术员(初级)技能鉴定精练考试题库及答案
- 2024-2025学年七年级语文下学期期中模拟卷05
- 实施《中华人民共和国反外国制裁法》的规定
- 2025年中国储能检测认证行业市场运行态势及发展趋势预测报告-智研咨询发布
- 湖南新高考教学教研联盟暨长郡二十校联盟2025届高三年级第二次联考物理试题及答案
- 诊断与评估课件 第十二节 资赋优异儿童特征及学习资料
- 襄阳市樊城区城市更新投资发展有限公司招聘考试真题2024
- 2022智能变电站网络记录及分析装置测试规范
- 严重过敏反应诊断和临床管理专家共识(2025)解读 2
- 生物泌尿系统的组成课件-+2024-2025学年冀少版生物七年级下册
- 2025职业健康培训
评论
0/150
提交评论