- 1、本文档共9页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
phrase-analysis-machine
编译原理实验报告
题目:词法分析器
实验内容
选择部分C语言的语法成分,设计其词法分析程序,要求能够处理注释、部分复合运算符(如++等)。
实验要求
要给出所分析语言的词法说明,相应的状态转换图,单词的种别编码方案,词法分析程序的主要算法思想等。
例C源程序待分析段:
main()
{
int A,B,C,D; /*类型说明*/
A=2; B=4; C=10; D=100;
while (AC and BD)
{
if (A==1) C=C-1;
else while (AD)
{A=A+2;}
}
}
实验分析:
用C语言编写一个词法分析器,使之能够识别输入串,并把分析结果(单词符号,标识符,关键字等等)输出。输入源程序,输入单词符号,本词法分析器可以辨别关键字,标识符,常数,运算符号和某些界符,利用手工输入获取源程序代码,再核对该源程序代码进行词法分析,这就是词法分析器的基本功能,当词法分析器调用预处理子程序处理出一串输入字符放进扫描缓冲区之后,分析器就从此缓冲区中逐一识别单词符号,当缓冲区里的字符串处理完之后,它又调用预处理子程序类似处理新串。
1)实验要求及设计方案:
关键字:if,else,for,do,while,switch,case,int,char,main
运算符和界符:; = - + / { } ( ) * # , ! ++ --
其他符号:
ID = letter( letter | digit)*
NUM = digit digit*
空格由空白、制表符和换行符组成。空格ID、NUM、运算符、界符、关键字有空格隔开,但空格在分析中忽略。
2)单词符号的种别编码方案 :
单词符号 种别码 单词符号 种别码 if 1 * 15 else 2 / 16 for 3 = 17 do 4 18 while 5 = 19 case 6 20 switch 7 = 21 int 8 , 25 char 9 ; 26 main 10 ( 27 letter(letter|digit)* 11 ) 28 digit digit* 12 { 29 } 30 + 13 ++ 36 - 14 -- 35
3)程序的主要算法思想和主要函数的算法思想及流程:
算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。
词法分析主程序示意图:
三个变量:token存放单词字符串;sum存放整形单词;syn存放单词种别码
流程图:
程序代码:
#includestdio.h
#includeiostream.h
#includestring.h
#includectype.h
char prog[120],token[8];
char ch;
int syn,p,m,n,sum;
char *rwtab[10]={if,else,for,do,while,switch,case,int,char,main};//数组定义关键字
void scaner(){
m=0;
for(n=0;n8;n++)//初始化token数组
token[n]=\0;
ch=prog[p++]; //存放扫描到的单词或字符的缓冲区
while(isspace(ch))
ch=prog[p++];
if(isalpha(ch)){//判断是否为字母
while(isalnum(ch)){//判断是否为字母或数字
token[m++]=ch;
ch=prog[p++];
}
--p;//回退字符
syn=10;
for(n = 0; n 10; n++)
if(strcmp(token,rwtab[n])==0){
syn=n+1;
break;
}
}//字母开头
else
if(isdigit(ch))//数字判断
{
sum=0;
while(isdigit(ch)){
sum =sum*10+ch-0;
ch=prog[p++];
}
p--;
syn=11;
}
else{
m=0;
//根据扫描到的运算符或界符选择赋予单词种别码,其中每个case语句中还有嵌
您可能关注的文档
- Oracle_开发工程师面试题必备.doc
- 【成才之路】2015-2016届高中语文第5课《荆轲刺秦王》练习新人教版必修1.doc
- Oracle分析函数与分组关键字的用法.docx
- 【技术分析】利用4种经典K线图分析股票及如何从量价关系判断该买进还是卖出.doc
- 【政治大一轮复习】2014高考政治一轮大复习:文化传承与创新(含答案,解题指南,解析).doc
- oracle常用函数,sybase常用函数.doc
- ORACLE数据库专周报告.doc
- ORACLE体系结构ORACLE3.doc
- oracle数据库简答题.docx
- 【地理】2011届高三月考、联考、模拟试题汇编:地图(2011年1月最新更新).doc
文档评论(0)