文档详情

山东理工大学编译原理词法分析实验报告.doc

发布:2018-05-16约3.94千字共8页下载文档
文本预览下载声明
实验报告 ——词法分析程序设计 【实验项目】 了解词法分析的主要任务。 2、熟悉编译程序的编制。 【实验要求】 1、构造一个小语言的文法; 2、设计单词的输出形式,单词的种类和值的表示方法; 3、编写词法分析程序cffx.c; 4、生成并输出单词符号表。 【实验内容】 根据某文法,构造一个基本词法分析程序。找出该语言的关键字、标识符、整数以及其他一些特殊符号,给出单词表(内容包括单词种类和值),构造符号表(内容包括name、kind、value和address等)。 【实验步骤】 1. 类C语言子集的文法 G[程序]: 程序→分程序 分程序→程序首部{程序体} 程序首部→program 标识符: 程序体→语句序列 语句序列→语句序列;语句|语句 标识符→字母|标识符字母|标识符数字 语句→定义语句|输入语句|复合语句|输出语句 类型→int | double | llint | lldouble 定义表→标识符|标识符,定义表 定义语句→类型定义表 输入语句→scanf(类型,标识符) 复合语句→赋值语句|循环语句|条件语句 输出语句→printf(类型,标识符) 赋值语句→标识符=表达式 循环语句→for型循环语句|while型循环语句 for型循环语句→for(表达式;表达式;表达式){语句|表达式} while型循环语句→while(表达式){语句|表达式} 条件语句→if(表达式){语句|表达式}else{语句|表达式} 表达式→因式运算符因式|因式运算符; 运算符→=|==|#||=||=|++|--|+|-|*|/|% 因式→(表达式)|标识符|数字|数字数字 字母→a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z 数字→0|1|2|3|4|5|6|7|8|9 2.单词分类 1 、keyword (关键字):program | int | double | llint | lldouble | scanf | printf | for | while | if |else 2 、identification (标识符): a|b|c|…… 3 、digit(数据):0|1|2|3|4|…… 4 、operatorsign (运算符):=|==|#||=||=|+ +|- -|+|-|*|/|% boundarysign(界符):{ } |( )| :| ;| , 词法分析源程序 /**********************头文件**********************/ #include stdio.h #include string.h #include conio.h #include ctype.h /*********************全局变量*********************/ char word[20];/*暂存单词*/ char test[500],*p; int count=1; char Keyword[11][10]={program,int,double,llint,lldouble,scanf,printf,for,while,if,else};//关键字数组 char Operatorsign[14][10]={=,==,#,,=,,=,++,--,+,-,*,/,%};//运算符数组 /*****************函数1:关键字、标识符识别****************/ char alpha() { int i=0,j=0;/*j=0是标识符,j=1是关键字*/ char *opp; while(isalnum(*p))/*检查是字母还是数字,如果是字母返回1,是数字返回2*/ { word[i]=*p; p++;i++; } opp=word; for(i=0;i11;i++)/*把字母与关键字表核对,如果是关键字就设置j=1*/ { if(!(strcmp(opp,Keyword[i])))/*比较两个字符串*/ { printf( %d Keyword %s\n,count,opp); /*识别关键字*/ j=1; } } if(j==0) printf( %d Identification %s\n,count,opp); /*识别标识符*/ p--; /*回退多读进的字符*/ return 0; } /*****************函数2:数据识别******************/ char digit() { int i=0; while(isdigit(*p))/*如
显示全部
相似文档