编译原理 词法分析 实验报告.doc
计算机与信息工程学院实验报告姓 名 李迪学 号专 业计算机科学与技术班 级09蒙班联 系 电 话Emaillidilxl同 组实验者实验室名 称信息楼403实 验日 期2011-10-20课 程名 称编译原理实 验 序 号实验一实 验项 目词法分析主 讲教 师王斯日古愣辅 导教 师王斯日古愣指 导教 师王斯日古愣实验心得:通过此次实验,让我了解到如何设计、编制并调试词法分析程序,加深对词法分析原理的理解;熟悉了构造词法分析程序的手工方式的相关原理,使用某种高级语言(例如C+语言)直接编写此法分析程序。另外,也让我重新熟悉了C+语言的相关内容,加深了对C+语言的用途的理解。学生签名:李迪 2011 年 10 月 20 日成绩评定及教师评语:成绩: 教师签名: 年 月 日注:硬件类实验报告请按附录1的格式填写;软件类实验报告请按附录2的格式填写。填写时应去掉红色的提示语。软件类实验报告一、 实验内容词法分析二、 实验目的及要求实验目的设计、编制并调式一个词法分析程序,加深对词法分析原理的理解。实验要求: 各种单词符号及对应的种别码:单词符号种别码单词符号种别码begin1:17if2:=18then3<20while4<>21do5<=22end6>23letter(letter|digit)*10>=24digit digit*11=25+13;26-14(27*15)28/16#0三、 实验环境C语言环境四、 算法描述 词法分析主程序示意图:置初值调用扫描子程序输入串结束?输出单词二元组是否结束 词法分析程序流程图: 开始变量初始化是否文件结束?返回拼数Syn=11返回拼字符串是否是关键字?Syn为对应关键字的单词种别码Syn=10给不同的符号相同的 Syn 值报错是否数字字母是否、运算符,界符等其他 五、 源程序清单#include"stdio.h"#include"stdlib.h"#include"string.h"#define _KEY_WORD_END "waiting for your expanding"typedef structint typenum;char * word;WORD;char input255;char token255=""int p_input;int p_token;char ch;char * rwtab="begin","if","then","while","do","end",_KEY_WORD_END;WORD * scaner();void main()int over=1;WORD* oneword=new WORD;printf(" 输入源程序 (以#结束):");scanf("%#s",input);p_input=0;printf("Your words:n%sn",input);while(over<1000&&over!=-1)oneword=scaner();if(oneword->typenum<1000)printf("(%d,%s)",oneword->typenum,oneword->word);over=oneword->typenum;printf("npress # to exit:");scanf("%#s",input);char m_getch()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<='z'|ch>='A'&&ch<='Z')return 1;elsereturn 0;int digit()if(ch>='0'&&ch<='9')return 1;elsereturn 0;int reserve()int i=0;while(strcmp(rwtabi,_KEY_WORD_END)if(!strcmp(rwtabi,token)return i+1;i=i+1;return 10;void retract()p_input=p_input-1;char * dtp()return NULL;WORD *scaner()WORD *myword=new WORD;myword->typenum=10;myword->word=" "p_token=0;m_getch();getbc();if(letter()while(letter()|digit()concat();m_getch();retract();myword->typenum=reserve(); myword->word=token;return(myword);else if(digit()while(digit()concat();m_getch();retract();myword->typenum=20;myword->word=token;return(myword);else switch(ch)case'=': m_getch(); if(ch='=') myword->typenum=39; myword->word="=" return(myword); retract(); myword->typenum=21; myword->word="=" return(myword); break; case'+': myword->typenum=22; myword->word="+" return(myword); break; case'-': myword->typenum=23; myword->word="-" return(myword); break; case'*': myword->typenum=24; myword->word="*" return(myword); break; case'/': myword->typenum=25; myword->word="/" return(myword); break;case'(': myword->typenum=26; myword->word="(" return(myword); break;case')': myword->typenum=27; myword->word=")" return(myword); break;case'': myword->typenum=28; myword->word="" return(myword); break;case'': myword->typenum=29; myword->word="" return(myword); break;case'': myword->typenum=30; myword->word="" return(myword); break;case'': myword->typenum=31; myword->word="" return(myword); break;case',': myword->typenum=32; myword->word="," return(myword); break;case':': myword->typenum=33; myword->word=":" return(myword); break;case'': myword->typenum=34; myword->word="" return(myword); break;case'>': m_getch(); if(ch='=') myword->typenum=37; myword->word=">=" return(myword); retract(); myword->typenum=35; myword->word=">" return(myword); break; case'<': m_getch(); if(ch='=') myword->typenum=38; myword->word="<=" return(myword); retract(); myword->typenum=36; myword->word="<" return(myword); break; case'!': m_getch(); if(ch='=') myword->typenum=40; myword->word="!=" return(myword); retract(); myword->typenum=-1; myword->word="ERROR" return(myword); break;case'0': myword->typenum=1000; myword->word="OVER" return(myword); break;default: myword->typenum=-1; myword->word="ERROR" return(myword); 六、 运行结果及分析运行结果: 通过此次实验,让我了解到如何设计、编制并调试词法分析程序,加深对词法分析原理的理解;熟悉了构造词法分析程序的手工方式的相关原理。