编译原理课程设计报告-词法语法分析器

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

..编译原理课程设计CourseDesignofCompiling(课程代码3273526)半期题目:词法和语法分析器实验学期:大三第二学期学生班级:2014级软件四班学生学号:2014112218学生姓名:何华均任课教师:丁光耀信息科学与技术学院2017.6课程设计1-C语言词法分析器1.题目..C语言词法分析2.内容选一个能正常运行的c语言程序,以该程序出现的字符作为单词符号集,不用处理c语言的所有单词符号。将解析到的单词符号对应的二元组输出到文件中保存可以将扫描缓冲区与输入缓冲区合成一个缓冲区,一次性输入源程序后就可以进行预处理了3.设计目的掌握词法分析算法,设计、编制并调试一个词法分析程序,加深对词法分析原理的理解4.设计环境(电脑语言环境)语言环境:C语言CPU:i7HQ6700内存:8G5.概要设计(单词符号表,状态转换图)5.1词法分析器的结构词法分析程序的功能:输入:所给文法的源程序字符串。输出:二元组(syn,token或sum)构成的序列。词法分析程序可以单独为一个程序;也可以作为整个编译程序的一个子程序,当需要一个单词时,就调用此法分析子程序返回一个单词.为便于程序实现,假设每个单词间都有界符或运算符或空格隔开,并引入下面的全局变量及子程序:1)ch存放最新读进的源程序字符2)strToken存放构成单词符号的字符串3)Buffer字符缓冲区4)structkeyType存放保留字的符号和种别5.2待分析的简单词法(1)保留字break、case、char、const、int、do、while…(2)运算符和界符=、+、-、*、/、%、,、;、(、)、?、#5.3各种单词符号对应的种别码单词符号种别码单词符号种别码ID0sizeof24INT1static25auto2struct26break3switch27源程序输入缓冲区预处理子程序扫描缓冲区1扫描缓冲区2词法分析子程序返回一个单词调用数据..case4typedef28char5union29const6unsigned30continue7void31default8volatile32do9while33double10=34else11+35enum12-36extern13*37float14/38for15%39goto16,40if17;41int18(42long19)43register20?44return21clear45short22#46signed23lettet(letter|digit)*47dightdight*485.3状态转换图..6.详细设计(数据结构,子程序)算法思想:首先设置3个变量:①strToken用来存放构成单词符号的字符串;②ch用来字符;③structkeyType用来存放单词符号的种别码。扫描子程序主要部分流程如下图所示。子程序结构:子程序名功能GETCHAR()读一个字符到ch中GETBC()读一个非空白字符到ch中CONCAT()把CHAR中字符连接到strToken之后..LETTER()判断CHAR中字符是否为字母DIGIT()判断ch中字符是否为数字RESERVE()用strToken中的字符串查找保留字表,并返回保留字种别码,若返回零,则非保留字RETRACT()把CHAR中字符回送到缓冲区7.程序清单//ConsoleApplication1.cpp:定义控制台应用程序的入口点。//#includestdafx.h#includestdio.h#includestdlib.h#includeconio.h#includestring.h#defineN47charch;charstrToken[20];//存放构成单词符号的字符串charbuffer[1024];//字符缓冲区structkeyType{charkeyname[256];intvalue;}Key[N]={{$ID,0},{$INT,1},{auto,2},{break,3},{case,4},{char,5},{const,6},{continue,7},{default,8},{do,9},{double,10},{else,11},{enum,12},{extern,13},{float,14},{for,15},{goto,16},{if,17},{int,18},{long,19},{register,20},{return,21},{short,22},{signed,23},{sizeof,24},{static,25},{struct,26},{switch,27},{typedef,28},{union,29},{unsigned,30},{void,31},{volatile,32},{while,33},{=,34},{+,35},{-,36},{*,37},{/,38},{%,39},{,,40},{;,41},{(,42},{),43},{?,44},{clear,45},{#,46}};voidGetChar()//读一个字符到ch中{inti;if(strlen(buffer)0){ch=buffer[0];for(i=0;i256;i++)buffer[i]=buffer[i+1];}elsech='\0';}voidGetBC()..//读一个非空白字符到ch中{inti;while(strlen(buffer)){i=0;ch=buffer[i];for(;i256;i++)buffer[i]=buffer[i+1];if(ch!=''&&ch!='\n'&&ch!='\0')break;}}voidConCat()//把ch连接到strToken之后{chartemp[2];temp[0]=ch;temp[1]='\0';strcat(strToken,temp);}boolLetter()//判断ch是否为字母{if(ch='A'&&ch='Z'||ch='a'&&ch='z')returntrue;elsereturnfalse;}boolDigit()//判断ch是否为数字{if(ch='0'&&ch='9')returntrue;elsereturnfalse;}intReserve()//用strToken中的字符查找保留字表,并返回保留字种别码,若返回0,则非保留字{inti;for(i=0;iN;i++)if(strcmp(strToken,Key[i].keyname)==0)returnKey[i].value;return0;}voidRetract()..//把ch中的字符回送到缓冲区{inti;if(ch!='\0'){buffer[256]='\0';for(i=255;i0;i--)buffer[i]=buffer[i-1];buffer[0]=ch;}ch='\0';}keyTypeReturnWord(){strcpy(strToken,\0);intc;keyTypetempkey;GetBC();if(ch='A'&&ch='Z'||ch='a'&&ch='z'){ConCat();GetChar();while(Letter()||Digit()){ConCat();GetChar();}Retract();c=Reserve();strcpy(tempkey.keyname,strToken);if(c==0)tempkey.value=0;elsetempkey.value=Key[c].value;}elseif(ch='0'&&ch='9'){ConCat();GetChar();while(Digit()){ConCat();GetChar();}Retract();strcpy(tempkey.keyname,strToken);tempkey.value=1;}..else{ConCat();strcpy(tempkey.keyname,strToken);tempkey.value=Reserve();}returntempkey;}/*主函数*/intmain(){//文件操作FILE*fp;if((fp=fopen(E:\\作业\\编译原理\\Ccode.txt,r))==NULL){printf(cannotopenfile/n);exit(1);}while(!feof(fp)){if(fgets(buffer,250,fp)!=NULL){printf(E:\\作业\\编译原理\\Ccode.txt\n);}}keyTypetemp;printf(单词\t种别号\n);while(strlen(buffer)){temp=ReturnWord();printf(%s\t%d\n\n,temp.keyname,temp.value);}printf(theend!\n);getch();return0;}8.运行结果E:/作业/编译原理/Code.txt运行结果..九、实验体会通过本次次法分析设计实验,我加深了对词法分析过程的理解。并在实际的设计过程深入的了解了编译原理思想。对编译原理课程有了更深的理解课程设计二:设计简单的语法分析器一、题目设计简单的语法分析器..二、设计内容用算符优先分析方法设计一个分析解释程序,对输入的赋值语句、输出语句、清除语句进行词法分析、语法分析、表达式求值并存储于指定变量中;若存在错误,提示错误相关信息。三、设计目的了解掌握算符优先分析的基本方法、内容;四、设计环境语言环境:C语言CPU:i7HQ6700内存:8G五、概要设计5.1设计思路语法分析的任务:把单词符号作为基本单位,分析程序是否为合法的程序.算符优先分析法是自下而上的语法分析方法,即根据文法,对输入字串进行归约,若能正确地归约为文法的初始符号,则表示输入字串是合法的.主要研究对输入的赋值语句、输出语句、清除语句进行词法分析、语法分析、表达式求值并存储于指定变量中;若存在错误,提示错误相关信息。文法表示:S→v=E|E?|clearE→E+T|E-T|TT→T*F|T/F|FF→(E)|v|c5.2单词种别码设计符号种别码=1?2+3-4*5..六、详细设计6.1变量及函数说明变量及函数名表示内容及操作intpriority[NUM][NUM]优先关系矩阵structWordType单词种别码结构structVarWord变量表中的元素结构mainStack归约栈wordStack单词串GetwordStack()输入串转化成单词串GetWord()从单词串中取单词ClearwordStack()、ClearmainStack()清空单词串和归约栈CheckvarTable(chara[])查看变量在变量表中的位置AddvarTable(VarWorda)变量表添加变量InitmainStack()初始化归约栈AddmainStack(WordTypea)归约栈添加Handle()归约处理程序MainHandle()归约子程序七、程序清单//ConsoleApplication1.cpp:定义控制台应用程序的入口点。///6(7)8v9c10clear11#12N13..#includestdafx.h#includestdio.h#includestdlib.h#includeconio.h#includestring.h#defineNUM14#defineM256#defineN47//保留字个数charch='\0';//存放最新读进的源程序字符charstrToken[20]=\0;//存放构成单词符号的字符串charbuffer[257]=\0;//字符缓冲区structkeyType{charkeyname[256];intvalue;}Key[N]={{$ID,0},{$INT,1},{auto,2},{break,3},{case,4},{char,5},

1 / 21
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功