编译原理课程设计-词法语法分析报告器_第1页
编译原理课程设计-词法语法分析报告器_第2页
编译原理课程设计-词法语法分析报告器_第3页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

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

文档简介

1、编译原理课程设计Course Design of Compiling(课程代码 3273526 )半期题目:词法和语法分析器实验学期:大三第二学期学生班级:2014级软件四班学生学号:2014112218学生姓名:何华均任课教师:丁光耀信息科学与技术学院2017. 6课程设计1-C语言词法分析器1. 题目C语言词法分析2. 内容选一个能正常运行的c语言程序,以该程序出现的字符作为单词符号集, 不用 处理c语言的所有单词符号。将解析到的单词符号对应的二元组输出到文件中保存可以将扫描缓冲区与输入缓冲区合成一个缓冲区, 一次性输入源程序后就可以进 行预处理了3. 设计目的掌握词法分析算法,设计、编制

2、并调试一个词法分析程序,加深对词法分析原 理的理解4. 设计环境(电脑语言环境)语言环境:C语言CPU:i7HQ6700内存:8G5. 概要设计(单词符号表,状态转换图)5.1词法分析器的结构词法分析程序的功能:输入:所给文法的源程序字符串。输出:二元组(syn,token 或sum)构成的序列。词法分析程序可以单独为一个程序;也可以作为整个编译程序的一个子程序, 当需要一个单词时,就调用此法分析子程序返回一个单词存放最新读进的源程序字符 存放构成单词符号的字符串 字符缓冲区存放保留字的符号和种别为便于程序实现,假设每个单词间都有界符或运算符或空格隔开,并引入下面 的全局变量及子程序:1)ch

3、2)strToke n3)Buffer源程序5.24)struct keyType输入缓冲区单词符号种别码单词符号种别码ID0sizeof24INT1static25auto2struct26break3switch275.3case4typedef28char5union29const6un sig ned30con ti nue7void31default8volatile32do9while33double10=34else11+35enum12-36exter n13*37float14/38for15%39goto16540if1741int18(42long19)43registe

4、r20?44return21clear45short22#46sig ned23lettet(letter|digit) *47dight dight*485.3状态转换图6. 详细设计(数据结构,子程序) 算法思想:首先设置3个变量:strToken用来存放构成单词符号的字符串;ch 用来字符;struct keyType用来存放单词符号的种别码。扫描子程序主要部分流程如下图所示。子程序结构:子程序名功能GETCHAR()读一个字符到ch中GETBC()读一个非空白字符到ch中CONCAT()把CHAR中字符连接到strToken 之后LETTER()判断CHAR中字符是否为字母DIGIT(

5、)判断ch中字符是否为数字RESERVE。用strToken中的字符串查找保留字表,并返回 保留字种别码,若返回零,则非保留字RETRACT()把CHAR中字符回送到缓冲区7. 程序清单/ Con soleApplicatio nl.cpp :定义控制台应用程序的入口点/#i nclude "stdafx.h"#i nclude "stdio.h"#i nclude "stdlib.h"#i nclude "coni o.h"#i nclude "stri ng.h"#defi ne N 47c

6、har ch;char strToken20;/存放构成单词符号的字符串char buffer1024;/ 字符缓冲区struct keyType char keyn ame256;int value;Key N = "$ID" ,0 , "$INT" ,1 , "auto" ,2 , "break" ,3 , "case" ,4 , "char" ,5 ,"const" ,6 , "double" ,10 , "else&q

7、uot; ,11 , "for" ,15 ,"goto" ,16 ,"if""continue" ,7 ,"default" ,8 ,"do" ,9 ,"enum",12 ,"extern" ,13 ,"float" ,14 ,17 ,"int" ,18 ,"long" ,19 , "register" ,20 ,"return" ,21

8、 ,"short" ,22 ,"struct",26 ,"switch" ,27 ,"void" ,31 , "volatile" ,32 , "/" ,38 ,"%",39 ,"," ,40 ,I! I!"signed" ,23 , "sizeof" ,24 , "static" ,25 ,"typedef" ,28 ,"union"

9、,29 ,"unsigned" ,30 ,"while" ,33 ,"=" ,34 ,"+" ,35 ,"-" ,36 , "*" ,37 ,"",41 ,"(" ,42 ,")" ,43 ,"?" ,44 , "clear",45 ,"#" ,46 ;void GetChar() /读一个字符到ch中 int i;if (strlen(buffer)>

10、;0) ch = buffer0;for (i = 0; i<256; i+)bufferi = bufferi + 1;elsech = '0'void GetBC()/读一个非空白字符到ch中int i;while (strlen(buffer) i = 0;ch = bufferi;for (; i<256; i+) bufferi = bufferi + 1;if (ch !=' ' &&ch != 'n' &&ch != '0' ) break;void ConCat()/把c

11、h连接到strToken之后char temp2;temp0 = ch;temp1 ='0'strcat(strToken, temp);bool Letter()/判断ch是否为字母if (ch >='A' &&ch <= 'Z' | ch >='a' &&ch <= 'z')returntrue ;elsereturnfalse ;bool Digit()/判断ch是否为数字if (ch >='O' &&ch <

12、= '9')return true ;elsereturn false ;int Reserve()0,则非保留字/用strToken中的字符查找保留字表,并返回保留字种别码,若返回int i;for (i = 0; i< N i+)if (strcmp(strToken, Keyi.keyname) = 0)retur n Keyi.value;return 0;void Retract()/把ch中的字符回送到缓冲区int i;if (ch !='0' ) buffer256 ='0'for (i = 255; i>0; i-)

13、bufferi = bufferi - 1;buffer0 = ch;ch = '0' keyType Retur nWord()strcpy(strToken, "0");int c;keyType tempkey;GetBC();if (ch >='A' &&ch <= 'Z' | ch >='a' &&ch <= 'z' ) Con Cat();GetChar();while (Letter() | Digit() Con Cat()

14、;GetChar();Retract();c = Reserve。;strcpy(tempkey.keyn ame, strToke n);if (c = 0)tempkey.value = 0;elsetempkey.value = Keyc.value;else if (ch >='O' &&ch <= '9' ) Con Cat();GetChar();while (Digit() Con Cat();GetChar();Retract();strcpy(tempkey.keyn ame, strToke n);tempkey.

15、value = 1;else Con Cat();strcpy(tempkey.keyn ame, strToke n);tempkey.value = Reserve。;return tempkey;/*主函数*/int main() /文件操作FILE *fp;if (fp = fopen(作业 编译原理 Ccode.txt" , "r" ) = NULL printf( "cannot open file/n" ); exit(1);while (!feof(fp) if (fgets(buffer, 250, fp) !=NULLpri

16、ntf(作业编译原理 Ccode.txtn" );keyType temp;printf("单词t种别号n");while (strlen(buffer) temp = Retur nWord();prin tf( "%st %dnn" , temp.ke yn ame, temp.value);printf( "the en d!n"); getch();return 0;8. 运行结果E:/作业/编译原理/Code.txtCcodc.txt记事丰哀件门竊辑:E)喘式(O)査看(V)帮助【H)int 2 二 10: int

17、 b=20:int c=0:if(a>0):c:useirstrdocumenlsvisua 1 studio 2017'|E:作业;須译!MCcode. txt单词种别号int18a0=34101V41int1$b0-3420141int18cD3401f41if17(12a0xn运行结果>001)43a034b0+35c041the end!九、实验体会通过本次次法分析设计实验,我加深了对词法分析过程的理解。并在实际的设计过程深入的了解了编译原理思想。对编译原理课程有了更深的理解课程设计二:设计简单的语法分析器题目设计简单的语法分析器设计内容用算符优先分析方法设计一个分

18、析解释程序,对输入的赋值语句、输出语句、清除 语句进行词法分析、语法分析、表达式求值并存储于指定变量中;若存在错误,提 示错误相关信息。三、设计目的了解掌握算符优先分析的基本方法、内容;四、设计环境语言环境:C语言CPU:i7HQ6700内存:8G五、概要设计5.1设计思路语法分析的任务:把单词符号作为基本单位,分析程序是否为合法的程序,若能正输出语算符优先分析法是自下而上的语法分析方法,即根据文法,对输入字串进行归约确地归约为文法的初始符号,则表示输入字串是合法的主要研究对输入的赋值语句、句、清除语句进行词法分析、语法分析、表达式求值并存储于指定变量中;若存在错误,提 示错误相关信息。文法表

19、示:St v=E|E?|cleari E+T|E-T|TTt T*F|T/F|FFt (E)|v|c5.2单词种别码设计符号种别码=1?2六、详细设计6.1 变量及函+3-4*5/6(7)8v9c10clear11#12N13数说明变量及函数名表示内容及操作int priorityNUMNUM优先关系矩阵struct WordType单词种别码结构struct VarWord变量表中的元素结构main Stack归约栈wordStack单词串GetwordStack()输入串转化成单词串GetWord()从单词串中取单词ClearwordStack() 、ClearmainStack()清空单

20、词串和归约栈CheckvarT able(char a)查看变量在变量表中的位置AddvarT able(VarWord a)变量表添加变量In itmai nStack()初始化归约栈Addmai nStack(WordType a)归约栈添加Han dle()归约处理程序Mai nHan dle()归约子程序七、程序清单/ Con soleApplicati on l.cpp :#in clude"stdafx.h"#in clude"stdio.h"#in clude"stdlib.h"#in clude"co ni

21、o.h"#in clude"stri ng.h"#defi neNUM4#defi neM256#defi neN 47/保留字个数char ch :='0'/存放最新读进的源程序字符char strToke n20="0"/存放构成单词符号的字符串char buffer257="0"/字符缓冲区structkeyType char keyn ame256;intvalue;Key N := "$ID",0 ,"$INT" ,1 , "auto" ,

22、2 ,/"break" ,3 , "case" ,4 , "char" ,5 ,"const" ,6 ,"continue",7 , "default" ,8 , "do" ,9 ,定义控制台应用程序的入口点。 "double" ,10 , "for" ,15 ,"else" ,11 , "goto" ,16 , "if" "return"

23、; ,21 ,"short" ,22 ,"struct",26 ,"switch" ,27 ,"enum",12 , "extern" ,13 , "float" ,14 ,17 ,"int" ,18 , "long" ,19 , "register",20 ,"signed" ,23 ,"sizeof" ,24 , "static" ,25 ,"

24、typedef" ,28 , "union" ,29 ,"unsigned" ,30 ,"void" ,31 , "volatile" ,32 ,"/" ,38 ,"%",39 ,"," ,40 ,"#" ,46 ;45 ,I! I!"while" ,33 ,"=" ,34 ,"+" ,35 ,"-" ,36 , "*" ,37

25、 ,"",41 ,"(" ,42 ,")" ,43 ,"?" ,44 , "clear",/优先关系矩阵 int priority NUM NUM= 0,0,0,0,0,0,0,0,0,0,0,0,0,0 , 0,0,0,0,0,0,0,0,0,0,0,0,0,0 , 0,0,0,0,0,0,0,0,0,0,0,0,1,0 , 0,0,0,1,1,-1,-1,-1,1,-1,0,0,1,0 , 0,0,0,1,1,-1,-1,-1,1,-1,0,0,1,0 , 0,0,0,1,1,1,1,-1,

26、1,-1,0,0,1,0 , 0,0,0,1,1,1,1,-1,1,-1,0,0,1,0 , 0,0,0,-1,-1,-1,-1,-1,2,-1,0,0,0,0 , 0,0,0,1,1,1,1,0,1,0,0,0,1,0 , 0,0,1,1,1,1,1,0,1,0,0,0,1,0 , 0,0,0,0,0,0,0,0,0,0,0,0,1,0 , 0,0,0,0,0,0,0,0,0,0,0,0,0,0 , 0,0,0,-1,-1,-1,-1,-1,0,0,0,0,3,0 , 0,0,1,0,0,0,0,0,0,0,0,0,1,0 ;struct VarTable VarWord elem M;in

27、t len;varTable;struct OperateStack WordTypeelem M; / 单词元素int len;OperateStack ma in Stack;/ 归约栈OperateStack wordStack;struct WordTypechar word M;int value;wordType NUM= "error",0 ,"=" ,1 ,"?" ,2,"+" ,3 ,"-" ,4 ,"*" ,5 ,"/",6 ,&quo

28、t;(" ,7 ,")",8 ,"$i" ,9 ,"$c" ,10 , "clear" ,11 ,"#",12 ,"$N" ,13 ;/*变量表*/struct VarWord char varname M; 变量名char value M;bool flag;void GetChar() /读一个字符到ch中int i;if (strlen(buffer)>0) ch = buffer0;for (i = 0; i<256; i+)bufferi =

29、bufferi + 1;elsech = '0'void GetBC() /读一个非空白字符到ch中int i;while (strlen(buffer) i = 0;ch = bufferi;for (; i<256; i+) bufferi = bufferi + 1;if (ch !=' ' &&ch != 'n' &&ch != '0' ) break;void ConCat() / 把 ch连接到 strToken 之后char temp2;temp0 = ch;temp1 =

30、9;0'strcat(strToken, temp);bool Letter() /判断ch是否为字母if (ch >='A' &&ch <= 'Z' | ch >='a' &&ch <= 'z')return true ;elsereturn false ;bool Digit() /判断ch是否为数字if (ch >='O' &&ch <= '9')return true ;elsereturn fals

31、e ;0,则非保留字int Reserve() /用strToken中的字符查找保留字表,并返回保留字种别码,若返回int i;for (i = 0; i< N i+)if (strcmp(strToken, Keyi.keyname) = 0)retur n Keyi.value;return 0;void Retract() /把ch中的字符回送到缓冲区int i;if (ch !='0' ) buffer256 ='0'for (i = 255; i>0; i-) bufferi = bufferi - 1;buffer0 = ch;ch =

32、'0' keyType Retur nWord()strcpy(strToken, "0");int c;keyType tempkey;GetBC();if (ch >='A' &&ch <= 'Z' | ch >='a' &&ch <= 'z' ) Con Cat();GetChar();while (Letter() | Digit() Con Cat();GetChar();Retract();c = Reserve。;strcpy

33、(tempkey.keyn ame, strToke n);if (c = 0)tempkey.value = 0;elsetempkey.value = Keyc.value;else if (ch >='O' &&ch <= '9' ) Con Cat();GetChar();while (Digit() Con Cat();GetChar();Retract();strcpy(tempkey.keyn ame, strToke n); tempkey.value = 1;else Con Cat();strcpy(tempkey

34、.ke yn ame, strToke n); tempkey.value = Reserve。; return tempkey; bool GetwordStack() int i;wordStack .len = 0;keyType temp;while (strlen(buffer) ("$c",10)("$i",9 )/关键字temp = ReturnWord();/词法分析器获得一个分析词if (temp.value = 1)/ 常数strcpy(wordStack.elemwordStack.len.word, temp.keyname);

35、wordStack.elemwordStack.le n.value = 10;else if (temp.value = 0)/ 变量strcpy(wordStack.elemwordStack.len.word, temp.keyname); wordStack.elemwordStack.le n.value = 9;else for (i = 0; i< NUMi+) if (strcmp(temp.keyname, wordTypei.word) = 0)wordStack.elemwordStack.le n = wordTypei; break;else if (i = N

36、UM- 1) printf("输入串中岀现未识别单词! n");return false ;wordStack .len+;wordStack.elemwordStack .len+= wordType12;return true ;/*从单词串中取单词*/WordTypeGetWord() WordTypetemp = wordStack.elem0; for ( int i = 0; i<wordStack.len - 1; i+)wordStack.elemiwordStack.le n-; return temp;void ClearwordStack()wo

37、rdStack .len = 0;void ClearmainStack()main Stack .len = 0;/*=wordStack.elemi + 1;/清空单词串/清空归约栈查看变量在变量表中的位置*/ int CheckvarTable( char a) for ( int i = 0; i< M i+)if (strcmp( a, varTable.elemi.varname) = 0) return i;else if (i = M- 1)return -1;/*添加变量*/void AddvarTable( VarWord a) varTable.elemvarTab

38、le .len= a;varTable .len+; /*初始化归约栈*/void InitmainStack()mai nStack.elem0 = wordType12; main Stack .len = 1;/*添加归约栈*/void AddmainStack( WordTypea)mai nStack.elemmai nStack.le n= a;main Stack .len+;/*归约*/bool Han dle()int i;/常量归约if (ma in Stack.elemma in Stack .len - 1.value = 10) mainStack.elemmainS

39、tack.len - 1.value = 13;/变量归约else if (mainStack.elemmainStack.len - 1.value = 9) mainStack.elemmainStack.len - 1.value = 13;i = CheckvarTable(ma in Stack.elemma in Stack .len - 1.word); if (i<0) pr in tf( "n 变量 s 未定义! ", main Stack.elemma in Stack .len - 1.word); return false ;elsestrcp

40、y(mainStack.elemmainStack.len - 1.word, varTable.elemi.value);/赋值归约else if (mainStack.elemmainStack.len - 2.value = 1) if (mainStack.elemmainStack.len - 3.value = 9) i = CheckvarTable(ma in Stack.elemma in Stack .len - 3.word);if (i<0) VarWord temp;strcpy(temp.varname, mainStack.elemmainStack.len

41、 - 3.word); strcpy(temp.value, mainStack.elemmainStack.len - 1.word); temp.flag = true ;AddvarTable(temp);elsestrcpy(varTable.elemi.value,strcpy(mainStack.elemmainStack.len -mai nStack.elemmai nStack.le n- 1.word);3.word, mai nStack.elemmai nStack.le n -1.word);mai nStack.elemmai nStack.le n - 3.val

42、ue = 13;else if (mainStack.elemmainStack.len - 3.value = 13)strcpy(mai nStack.elemmai nStack.le n -3.word, mai nStack.elemmai nStack.le n-1.word);mai nStack.le n = mai nStack.le n - 2;/运算归约else if (mainStack.elemmainStack.len - 2.value = 3) int a, b;a = atoi(ma in Stack.elemma in Stack .len - 1.word

43、);b = atoi(ma in Stack.elemma in Stack .len - 3.word);a = a + b;itoa(a, mainStack.elemmainStack.len - 3.word, 10);mai nStack.le n = mai nStack.le n - 2;else if (mainStack.elemmainStack.len - 2.value = 5) int a, b;a = atoi(ma in Stack.elemma in Stack .len - 1.word);b = atoi(ma in Stack.elemma in Stac

44、k .len - 3.word);a = a*b;itoa(a, mainStack.elemmainStack.len - 3.word, 10);mai nStack.le n = mai nStack.le n - 2;/输出语句else if (wordStack.elem0.value = 2 && mainStack.elemmainStack.len -1.value = 13&& mainStack.elemmainStack.len - 2.value = 12) printf( "n 表达式的值为 %s", mainStack.elemmainStack.len - 1.word);main Stack .len = 0;/结束归约else if (mainStack.elemmainStack.len - 2.value = 12 && wordStack.elem0.value =12)mai nStack.le n = mai nStack.le n - 2;return true ;bool Mai nHan dle() while (wordStack.len)if (prioritymainStack.elemmainStack.len -1.

温馨提示

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

评论

0/150

提交评论