1、a)需求分析:说明程序任务 输入及其范围,输出形式,测试数据(正确,错误数据) 测试数据:void main( )int a,b;a=10;b=a+20;End输出形式:(2,”main”)(5,”(“)(5,”)“)(5,”“)(1,”int”)(2,”a”)(5,”,”)(2,”b”)(5,”;”)(2,”a”)(4,”=”)(3,”10”)(5,”;”)(2,”b”)(4,”=”)(2,”a”)(4,”+”)(3,”20”)(5,”;”)(5,”“) 词法分析器的功能是输入源程序,输出单词符号。 本实验中,可采用的是一大类符号一类别码的方式。b)概要设计 主程序流程: 否 是模块间的调用
2、关系:c)详细设计 主函数:#include string.hchar prog80,token8,ch;int syn,p,m,n,sum;char *rwtab6=begin,ifthenwhiledoend;void scaner(void);int main() p=0; printf(please input a string(end with #):n); do scanf(%c,&ch); progp+=ch; while(ch!= scaner(); switch(syn) case 11:( %-10d%5d )n,sum,syn); break; case -1:you h
3、ave input a wrong stringn return 0; default:( %-5d %s %s %s)n,syn,“,token,” while(syn!=0);Scaner()函数:void scaner(void) 实现对输入程序的分析; 并将分析结果返回给main()函数;(详细源代码见电子稿)4、运行结果及分析输入程序:运行结果:时间复杂度分析:本实验对每个字符逐一读取,以单词为单位,与原有的合法字符进行一一比对,时间复杂度为单词个数的常数倍,所以对于n个字符的源程序复杂度为n。五、实验体会经过这次试验,理解了词法分析的基本思想,对编译器的编译过程有了一定的了解。最重
4、要的是,这次课程设计,在锻炼我编程能力的同时,让我对课堂上学到的知识有了比较透彻的理解。实验二 C-语言的词法分析器(基于Lex)一.课程设计目标自动构造C-语言的的词法分析器,要求能够掌握编译原理的基本理论,,理解编译程序的基本结构,掌握编译各阶段的基本理论和技术,掌握编译程序设计的基本理论和步骤.,增强编写和调试高级语言源程序的能力,掌握词法分析的基本概念和实现方法,熟悉C-语言的各种Token。二.分析与设计过程基于Parser Genarator的词法分析器构造方法Lex输入文件由3个部分组成:定义集(definition),规则集(rule)和辅助程序集(auxiliary rout
5、ine)或用户程序集(user routine)。这三个部分由位于新一行第一列的双百分号分开,因此,Lex输入文件的格式如下definitions%rulesauxiliary routines而且第一部分用“%”和“%”括起来。第一和第三个部分为C语言的代码和函数定义,第二个部分为一些规则。定义正则表达式如下 ID = letter letter*NUM = digit digit*Letter = a|z|A|ZDigit = 0|9Keyword = else|if|int|return|void|whileSpecial symbol = +|-|*|/|=|=|!=|=|;|,|(|
6、)|/*|*/White space = “ ”Enter = n在lex中的构造letter A-Za-zdigit 0-9id (letter|_)(letter|digit|_)*error_id (digit)+(letter)+ num digit+whitespace t+enter n+在Lex中的规则定义构造定义识别保留字规则int|elsereturnvoidUpper(yytext,yyleng);printf(%d 行 ,lineno);%s reserved wordn,yytext);/保留字定义识别数字规则num printf(%s NUMn/数字定义识别专用符号规
7、则;()*/+-stdlib.hint lineno=1;/定义行号%/定义正则表达式letter A-Za-z /字母digit 0-9 /数字id (letter|_)(letter|digit|_)* /开头为字母的标识符error_id (digit)+(letter)+ /开头为数字的错误标识符num digit+ /数字集合whitespace t+ /空格enter n+ /回车/定义识别规则/识别保留字 /打印行号/输出保留字/识别数字/输出数字/识别专用符号/输出特殊符号/识别标识符/打印行号/打印标识符/识别错误的标识符 printf( %sn/识别空格/识别回车/转换大小
8、写Upper(char *s,int l)int i;for(i=0;il;i+)si=toupper(si);/将保留字变为大写/主函数main(void) /定义输入文件名变量 char infilename400;输入文件名:%sinfilename); yyin = fopen(infilename,r/读取文件开始词法分析: n return yylex();4.测试结果 测试的文件代码(第一组)测试结果分析测试的文件代码(第二组)测试的文件代码(第三组)五.总结通过这次试验,掌握了编译原理的基本理论,,理解了编译程序的基本结构,掌握了编译各阶段的基本理论和技术,虽然遇到了很多困难,但是通过自己的努力和老师同学的帮助,掌握了词法分析的基本概念和实现方法。让我对词法分析有了进一步的了解,学会了运用Lex自动构造词法分析器,学会了基于Parser Genarator的词法分析器构造方法。