当前位置:文档之家› 北京科技大学编译原理实验报告

北京科技大学编译原理实验报告

编译原理实验报告学院: 计算机与通信工程学院专业: 计算机科学与技术班级:学号:姓名:实验成绩:词法分析一、实验目的设计、编制并调试一个词法分析程序,加深对词法分析原理的理解。

二、实验要求2.1 待分析的简单的词法(1)关键字:begin if then while do end所有的关键字都是小写。

(2)运算符和界符:= + - * / < <= <> > >= = ; ( ) #(3)其他单词是标识符(ID)和整型常数(SUM),通过以下正规式定义:ID = letter (letter | digit)*NUM = digit digit*(4)空格有空白、制表符和换行符组成。

空格一般用来分隔ID、SUM、运算符、界符和关键字,词法分析阶段通常被忽略。

2.2 各种单词符号对应的种别码:输入:所给文法的源程序字符串。

输出:二元组(syn,token或sum)构成的序列。

其中:syn为单词种别码;token为存放的单词自身字符串;sum为整型常数。

例如:对源程序begin x:=9: if x>9 then x:=2*x+1/3; end #的源文件,经过词法分析后输出如下序列:(1,begin)(10,x)(18,:=)(11,9)(26,;)(2,if)……三、词法分析程序的算法思想:算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。

3.1 主程序示意图:3.2词法分析程序流程图:四、词法分析程序的C++语言程序源代码:#include"stdio.h" #include"stdlib.h" #include"string.h"#define _KEY_WORD_END "waiting for your expanding" typedef struct开始 变量初始化是否文件结束?返回拼数Syn=11返回拼字符串是否是关键字?Syn 为对应关键字的单词种别码Syn=10给不同的符号相同的 Syn 值报错是否数字字母是否运算符, 界符等其他{int typenum;char * word;}WORD;char input[255];char token[255]="";int p_input;int p_token;char ch;char * rwtab[]={"begin","if","then","while","do","end",_KEY_WORD_END}; WORD * scaner();int main(){int over=1;WORD* oneword=new WORD;printf(" 输入源程序(以#结束):");scanf("%[^#]s",input);p_input=0;printf("Your words:\n%s\n",input);while(over<1000&&over!=-1){oneword=scaner();if(oneword->typenum<1000)printf("(%d,%s)\n",oneword->typenum,oneword->word);over=oneword->typenum;}printf("\npress # to exit:");scanf("%[^#]s",input);return 0;}char m_getch(){ch=input[p_input];p_input=p_input+1;return(ch);}void getbc(){while(ch==' '||ch==10){ch=input[p_input];p_input=p_input+1;}}void concat(){token[p_token]=ch;p_token=p_token+1;token[p_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(rwtab[i],_KEY_WORD_END)){if(!strcmp(rwtab[i],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="=";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=",";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";break;case'\0': myword->typenum=1000;myword->word="OVER";return(myword);break;default: myword->typenum=-1;myword->word="ERROR";return(myword);}}五、结果分析:输入begin x:=9: if x>9 then x:=2*x+1/3; end # 后如图所示:六、总结:词法分析的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。

相关主题