编译原理词法分析程序设计实验报告【实验目的】1.了解词法分析的主要任务。
2.熟悉编译程序的编制。
【实验容】根据某文法,构造一基本词法分析程序。
找出该语言的关键字、标识符、整数以及其他一些特殊符号,给出单词的种类和值。
【实验要求】1.构造一个小语言的文法类C小语言文法(以EBNF表示)<程序>::=<分程序>{<分程序>} .<分程序>::=<标识符>’(’<变量说明部分>{,<变量说明部分>}’)’<函数体><变量说明部分>::=int<标识符>{,<标识符>}<函数体>::=’{’[<变量说明部分>;]<语句序列>’}’<语句序列>::=<语句序列>;<语句>|<语句><语句>::=<赋值语句>|<条件语句>|<循环语句>|<函数调用语句><赋值语句>::=<标识符>=<表达式><表达式>::=[+|-]<项>{<加法运算符><项>}<项>::=<因子>{<乘法运算符><因子>}<因子>:=<标识符>|<无符号整数><加法运算符>::= +|-<乘法运算符>::= *|/<条件语句>::=if<条件>’{’<语句序列>’}’[else’{’<语句序列>’}’]<条件>::=<表达式><关系运算符><表达式><关系运算符>::= ==|!=|>|<|>=|<=<循环语句>::=for’(’<表达式>;<条件>;<表达式>’)’ ’{’<语句序列>’}’<函数调用语句>::=<标识符>’(’<标识符>{,<标识符>}|<空>’)’<标识符>::=<字母>{<字母>|<数字>}<无符号整数>::=<数字>{<数字>}<字母>::=a|b|c|…|X|Y|Z<数字>::=0|1|2|…|8|9单词分类情况关键字:int if else for标识符:以字母开头的字母和数字的组合关系运算符: ==|!=|>|<|>=|<=加法运算符:+|-乘法运算符: *|/界符:,;{ } ( )2.设计单词的输出形式,单词的种类和值的表示方法种别码单词值如:1 int3. 编写词法分析程序cffx.c实现基本的词法分析器,能够分析关键字、标识符、数字、运算符(需要有“==”或“:=”之类需要超前搜索的运算符)以及其他一些符号。
// 编译原理词法分析程序.cpp#include<stdio.h>#include<stdlib.h>#include<string.h>typedef struct words{int id;char name[20];char value[20];}word;char integer[20]={'i','n','t'};char iff[20]={'i','f'};char elsee[20]={'e','l','s','e'};char forr[20]={'f','o','r'};int main(){char code[10000];char words[20],ch;int i,j,p,count,n,m;int k=0;word symbol[500];printf("种别码:1 类别:关键字int\n");printf("种别码:2 类别:关键字if\n");printf("种别码:3 类别:关键字else\n");printf("种别码:4 类别:关键字for\n");printf("种别码:5 类别:标识符\n");printf("种别码:6 类别:计算运算符\n");printf("种别码:7 类别:关系运算符\n");printf("种别码:8 类别:界符\n");while(1){gets(code);n=strlen(code);for(m=0,j=0;m<n;m++){if((code[m]>='a'&&code[m]<='z')||(code[m]>='0'&&code[m]<='9')){words[j]=code[m];j++;}else{if(words[0]=='i'&&words[1]=='n'&&words[2]=='t'&&words[3]=='\0'){symbol[k].id=1;for(i=0;i<20;i++){symbol[k].value[i]=words[i];}k++;}else if(words[0]=='i'&&words[1]=='f'&&words[2]=='\0'){symbol[k].id=2;for(i=0;i<20;i++){symbol[k].value[i]=iff[i];}k++;}elseif(words[0]=='e'&&words[1]=='l'&&words[2]=='s'&&words[3]=='e'&&words[4]=='\0') {symbol[k].id=3;for(i=0;i<20;i++){symbol[k].value[i]=elsee[i];}k++;}elseif(words[0]=='f'&&words[1]=='o'&&words[2]=='r'&&words[3]=='\0'){symbol[k].id=4;for(i=0;i<20;i++){symbol[k].value[i]=forr[i];}k++;}else{symbol[k].id=5;for(i=0;i<20;i++){symbol[k].value[i]=words[i];}k++;}for(p=0;p<20;p++){words[p]=0;}j=0;if(code[m]=='+'){symbol[k].id=6;symbol[k].value[0]='+';for(i=1;i<20;i++){symbol[k].value[i]=0;}k++;}if(code[m]=='-'){symbol[k].id=6;symbol[k].value[0]='-';for(i=1;i<20;i++){symbol[k].value[i]=0;}k++;}if(code[m]=='*'){symbol[k].id=6;symbol[k].value[0]='*';for(i=1;i<20;i++){symbol[k].value[i]=0;}k++;}if(code[m]=='/'){symbol[k].id=6;symbol[k].value[0]='/';for(i=1;i<20;i++){symbol[k].value[i]=0;}k++;}if(code[m]=='='&&code[m+1]!='=') {symbol[k].id=6;symbol[k].value[0]='=';for(i=1;i<20;i++){symbol[k].value[i]=0;}k++;}if(code[m]=='='&&code[m+1]=='=') {symbol[k].id=7;symbol[k].value[0]='=';symbol[k].value[1]='=';for(i=2;i<20;i++){symbol[k].value[i]=0;}k++;m++;}if(code[m]=='!'&&code[m+1]=='=') {symbol[k].id=7;symbol[k].value[0]='!';symbol[k].value[1]='=';for(i=2;i<20;i++){symbol[k].value[i]=0;}k++;m++;}if(code[m]=='>'&&code[m+1]=='=') {symbol[k].id=7;symbol[k].value[0]='>';symbol[k].value[1]='=';for(i=2;i<20;i++){symbol[k].value[i]=0;}k++;m++;}if(code[m]=='<'&&code[m+1]=='=') {symbol[k].id=7;symbol[k].value[0]='<';symbol[k].value[1]='=';for(i=2;i<20;i++){symbol[k].value[i]=0;}k++;m++;}if(code[m]=='>'){symbol[k].id=7;symbol[k].value[0]='>';for(i=1;i<20;i++){symbol[k].value[i]=0;}k++;}if(code[m]=='<'){symbol[k].id=7;symbol[k].value[0]='<';for(i=1;i<20;i++){symbol[k].value[i]=0;}k++;}if(code[m]==','){symbol[k].id=8;symbol[k].value[0]=',';for(i=1;i<20;i++){symbol[k].value[i]=0;}k++;}if(code[m]==';'){symbol[k].id=8;symbol[k].value[0]=';';for(i=1;i<20;i++){symbol[k].value[i]=0;}k++;}if(code[m]=='('){symbol[k].id=8;symbol[k].value[0]='(';for(i=1;i<20;i++){symbol[k].value[i]=0;}k++;}if(code[m]==')'){symbol[k].id=8;symbol[k].value[0]=')';for(i=1;i<20;i++){symbol[k].value[i]=0;}k++;}if(code[m]=='{'){symbol[k].id=8;symbol[k].value[0]='{';for(i=1;i<20;i++){symbol[k].value[i]=0;}k++;}if(code[m]=='}'){symbol[k].id=8;symbol[k].value[0]='}';for(i=1;i<20;i++){symbol[k].value[i]=0;}k++;}}count=k;}system("cls");for(i=0;i<count;i++){printf("%d ",symbol[i].id);printf("%s\n",symbol[i].value);}}return 0;}4.生成并输出单词符号表识别单词的状态转换图:5.流程图6.源程序清单int a,b,c;a=b+c;7.测试结果8.实验心得:此次实验让我了解了如何设计、编制并调试词法分析程序,并加深了我对词法分析器原理的理解;熟悉了直接构造词法分析器的方法和相关原理,并学会使用c语言直接编写词法分析器;同时更熟练的掌握用c语言编写程序,实现一定的实际功能。