《实验1 词法分析.doc》由会员分享,可在线阅读,更多相关《实验1 词法分析.doc(5页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、实验1 词法分析 一、实验目的 通过设计调试词法分析程序,实现从源程序中分出各种单词的方法;加深对课堂教学的理解;提高词法分析方法的实践能力。 二、实验要求 (1)掌握词法分析的实现方法。 (2)上机调试编出的词法分析程序。 (3)源程序可以从键盘输入也可以事先存在文件中 (4)将源程序中的各个单词读出后可以显示在屏幕中也可以存在文件中(包括单词的类别)三、实验题目 用 C/C+ 语言编写以下 C/C+ 子集的词法分析程序。四、实验代码/*测试数据BEGINVAR A+,2A,A3,A4:INTEGER;A1:=1,A2:=123,A3:=123-12;WHILE A2=A3 DO A4:=2
2、34A*123/45+A1iF A1A2 THEN A1:=A4;ELSE A4:=(A1+A2)*A!;END*/#include#include#includeusing namespace std;int letter(char c)/字母if(c=A & c=0 & c=9)return 1;else return 0;int oper(char c)/运算符if(c=+ | c=- | c=* | c=/)return 1;else return 0;int relation(char c)/关系运算符if(c=|c=)return 1;else return 0;int jiefu
3、(char c)/界符if(c=, | c=: | c=;| c=.| c=(| c=)return 1;else return 0;int border(char c)/单词边界if(c=, | c=: | c=;| c= | c=. | c=(| c=)| c=+ | c=- | c=* | c=/ | c=| c= )return 1;else return 0;int illegal(char *s)/找非法字符int i,l=strlen(s);for(i=0;il;i+)if(!letter(si) & !digit(si)return 1;return 0;int identif
4、ier(char *s)/标识符if(illegal(s)return 0;if( letter(s0) ) return 1;else return 0;int unsigned_word(char *s)/无符号数int i,len=strlen(s);for(i=0;ilen;i+)if(!digit(si)return 0;return 1;int r_word(char *s)/保留字if(illegal(s)return 0;else if(!strcmp(s,INTEGER) return 1;else if(!strcmp(s,WHILE) return 1; else if(
5、!strcmp(s,BEGIN) return 1;else if(!strcmp(s,ELSE) return 1;else if(!strcmp(s,VAR) return 1;else if(!strcmp(s,END) return 1;else if(!strcmp(s,IF) return 1;else if(!strcmp(s,DO) return 1;else if(!strcmp(s,THEN) return 1;else return 0;void judge_word(char *s)/判断单词int len=strlen(s);if(len=0)return ;if(r
6、_word(s)cout保留字: sendl;else if(identifier(s)cout标识符: sendl;else if(unsigned_word(s)cout无符号数: sendl;else cout非法单词: sendl;void main()char s100,word100;while(gets(s)int i,j=0,len=strlen(s);for(i=0;ilen;i+)if(border(si)wordj=0;j=0;judge_word(word);if(si=: & si+1=)cout赋值符:sisi+1 & si+1= | si= & si+1= | si=)cout关系运算符: sisi+1endl;i+;word0=0;continue;else if(relation(si)cout关系运算符: siendl;word0=0;continue;else if(oper(si)cout运算符: siendl;word0=0;continue;else if(jiefu(si)cout界符: siendl;word0=0;continue;elsewordj+=si;if(j)wordj=0;judge_word(word);五、运行结果