编译原理词法分析程序设计实验报告

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

{

symbol[k].value[i]=iff[i];

char code[10000]; char words[20],ch;

int i,j,p,count,n,m; int k=0;

类别:关键字 int\n"); 类别:关键字 if\n"); 类别:关键字 else\n") 类别:关键字 for\n"); 类别:标识符 \n"); 类别:计算运算符 \n") 类别:关系运算符 \n") 类别:界符 \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++)

{ }

k++;

word symbol[500];

printf(" 种别码: 1

printf(" 种别码: 2

printf(" 种别码: 3

printf(" 种别码: 4

printf(" 种别码: 5

printf(" 种别码: 6

printf(" 种别码: 7

printf(" 种别码: 8

}

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;

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++;

}

相关文档
最新文档