编译原理词法分析程序设计实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
编译原理词法分析程序设计实验报告
【实验目的】
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 int
3. 编写词法分析程序cffx.c
实现基本的词法分析器,能够分析关键字、标识符、数字、运算符(需要有“==”或“:=”之类需要超前搜索的运算符)以及其他一些符号。
// 编译原理词法分析程序.cpp
#include
#include
#include
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 { 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++; } else if(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++; } else if(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;