山东理工大学编译原理词法分析实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验报告
——词法分析程序设计
【实验项目】
1、了解词法分析的主要任务。
2、熟悉编译程序的编制。
【实验要求】
1、构造一个小语言的文法;
2、设计单词的输出形式,单词的种类和值的表示方法;
3、编写词法分析程序cffx.c;
4、生成并输出单词符号表。
【实验内容】
根据某文法,构造一个基本词法分析程序。找出该语言的关键字、标识符、整数以及其他一些特殊符号,给出单词表(内容包括单词种类和值),构造符号表(内容包括name、kind、value和address等)。
【实验步骤】
1.类C语言子集的文法
G[<程序>]:
<程序>→<分程序>
<分程序>→<程序首部>{<程序体>}
<程序首部>→program<标识符>:
<程序体>→<语句序列>
<语句序列>→<语句序列>;<语句>|<语句>
<标识符>→<字母>|<标识符><字母>|<标识符><数字>
<语句>→<定义语句>|<输入语句>|<复合语句>|<输出语句>
<类型>→int|double|llint|lldouble
<定义表>→<标识符>|<标识符>,<定义表>
<定义语句>→<类型><定义表>
<输入语句>→scanf(<类型>,<标识符>)
<复合语句>→<赋值语句>|<循环语句>|<条件语句>
<输出语句>→printf(<类型>,<标识符>)
<赋值语句>→<标识符>=<表达式>
<循环语句>→
<条件语句>→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(运算符):=|==|#|<|<=|>|>=|++|--|+|-|*|/|%
5、boundarysign(界符):{}|()|:|;|,
3.词法分析源程序
/**********************头文件**********************/
#include
#include
#include
#include
/*********************全局变量*********************/
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;i<11;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--;/*回退多读进的字符*/
return0;
}
/*****************函数2:数据识别******************/
char digit()
{
int i=0;
while(isdigit(*p))/*如果是数字,返回1,否则返回0*/
{
word[i]=*p;
i++;p++;
}
printf("%d Digit%s\n",count,word);
p--;/*回退多读进的字符*/
return0;
}
/*****************函数3:运算符识别******************/
char operatorsign()
{
int i=0;
char*opp;
while(!isalnum(*p))/*检查是否是符号*/
{
if(*p=='{'||*p=='}'||*p=='('||*p==')'||*p==':'||*p==';'||*p==',')break;
word[i]=*p;
p++;i++;
}
opp=word;
for(i=0;i<14;i++)/*把符号与运算符核对*/
{
if(!(strcmp(opp,Operatorsign[i])))/*比较两个字符串*/
{
printf("%d Operatorsign%s\n",count,opp);/*识别运算符*/
}
}
p--;/*回退多读进的字符*/
return0;
}
/*********************主函数***********************/
int main()
{
int i,k=0;
memset(test,0,500);/*把test所指内存区域的前500个字节设置成字符0*/
strcpy(test,"program a:\n{\n int i=10,j=0;\n if(i>=1)\n{\n j=i+2;\n}\n else\n{\n j++;\n}\n}\n");
printf("The test program is:\n");