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

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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(<类型>,<标识符>)

<赋值语句>→<标识符>=<表达式>

<循环语句>→|

→for(<表达式>;<表达式>;<表达式>){<语句>|<表达式>}→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(运算符):=|==|#|<|<=|>|>=|++|--|+|-|*|/|%

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");

相关文档
最新文档