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

词法分析程序实验报告

1、 实验内容

待分析的简单语言的词法:

关键字:begin if then end (小写)

运算符::= + - * / >

界符:; #

标识符:ID=letter (letter|digit)*

常数:NUM=digit digit*

要求编写词法分析程序,

键盘输入源程序(以#结束),输出单词符号的二元式。

(标识符1,常数2,关键字3,运算符4,界符5)

输入:

begin

x:=9;

if x>0 then x:=2*x+1/3;

end

#

输出:

3 begin

1 x

4 :=

2 9

5 ;

2、基本思想

首先输入字符串,存入一个字符数组中,然后再逐个读入字符,判断如果不为空、结束

符、换行符,则继续进行下面的判断,如果是其中三者中的一个,则读入下一个字符。

3、核心算法

核心算法在本程序中是while循环语句,首先检测当前的字符ch是否是‘#’,如果是就跳出循环,说明字符串分析结束,输出界符标示和字符‘#‘,如果则进入下面的分析。

如果ch是NULL或者换行符,则读入下一个字符,如果不是,继续分析。

如果ch是字母,存入text字符数组中,然后继续读入,直到读入的不是字母或者数字。则text数组中存放的是关键字或者标识符,将text中存放的字符数组和关键字比较,如果是关键字则输出关键字标示,如果不是,则输出标识符标示和字符串。读入下一个字符。

如果ch是数字,存入text字符数组中,然后继续读入,直到读入的不是字母数字。则text中存放的是数字,并输入数字标示和字符串。读入下一个字符。

如果ch是除‘:=’外的运算符,则输出运算符标示和字符。如果ch是‘:’,判断下一个字符是不是‘=’,如果是,则输出运算符标示和‘:=’,如果不是,则输出出错。读入下一个字符。

如果ch是界符,则输出界符标示和字符。读入下一个字符。

4、实验结果

实验结果如下:

begin

x:=9;

if x>0 then x:=2*x+1/3;

end#

运行结果如下:

5、实验心得

在第一次做这个实验的那个下午,做出来的没有现在这样完善,当时只能分析一行代码,现在可以换行输入。

其实这个实验最重要的就是分类比较复杂,分支比较多,如果不注意就会因为分类的问题而出错,把我好这一点就能掌握做好这个程序的精髓。

当然现在这个程序本身也存在着许多不完备的地方,比如不能读文件,而且对于查错也做的不是很好(我只是写了一下出错提示,不能显示哪一行出错了)......

如此而已......

程序源代码如下:#include

#include

#include

#include

#include

#include

char Getchar(char* &p){

char ch;

ch=*(p++);

return ch;

}

void main(){

char expression[100],*pExpression,text[20];

char ch=' ';

int i=0;

scanf("%c",&expression[0]);

while(expression[i]!='#'){

i=i+1;

scanf("%c",&expression[i]);

}//输入源程序串

pExpression=expression;

ch=Getchar(pExpression);

while(ch!='#'){//大循环开始

if(ch==' '||ch=='\t'||ch=='\n') ch=Getchar(pExpression);

else{

if(isalpha(ch)){//开头是字母

for(i=0;i

i=0;

while(isalpha(ch)||isdigit(ch))

{

text[i]=ch;

i++;

ch=Getchar(pExpression);

}

text[i]='\0';

if(!strcmp(text,"begin")||!strcmp(text,"if")||!strcmp(text,"then")||!strcmp(text,"end")) printf("3 类型是关键字 %s\n",text);

else printf("1 类型是标识符 %s\n",text);

}

else{ //是数字

for(i=0;i

text[i]='\0';

i=0;

if(isdigit(ch)){

while(isdigit(ch)){

text[i]=ch;

i++;

ch=Getchar(pExpression);

}

printf("2 类型是常数 %s\n",text);

}

else{//是运算符(除了运算符:=)

if(ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='')

{printf("4 类型是运算符 %c\n",ch);ch=Getchar(pExpression);}

else{//是运算符:=

if(ch==':'){ if(Getchar(pExpression)=='=') {printf("4 类型是运算符 :=\n");ch=Getchar(pExpression);}

else { printf("Error =\n"); ch=Getchar(pExpression);} }

else{//是界符

if(ch==';'||ch=='('||ch==')'){printf("5 类型是界符 %c\n",ch);ch=Getchar(pExpression);}

else {printf("Error\n"); ch=Getchar(pExpression);}

}//是界符结束

}//是运算符结束

}

}

}

}//while循环结束

printf("5 类型是界符 #\n");

}//mian函数结束

词法分析程序实验报告

1、 实验内容

待分析的简单语言的词法:

关键字:begin if then end (小写)

运算符::= + - * / >

界符:; #

标识符:ID=letter (letter|digit)*

常数:NUM=digit digit*

要求编写词法分析程序,

键盘输入源程序(以#结束),输出单词符号的二元式。

(标识符1,常数2,关键字3,运算符4,界符5)

输入:

begin

x:=9;

if x>0 then x:=2*x+1/3;

end

#

输出:

3 begin

1 x

4 :=

2 9

5 ;

2、基本思想

首先输入字符串,存入一个字符数组中,然后再逐个读入字符,判断如果不为空、结束

符、换行符,则继续进行下面的判断,如果是其中三者中的一个,则读入下一个字符。

3、核心算法

核心算法在本程序中是while循环语句,首先检测当前的字符ch是否是‘#’,如果是就跳出循环,说明字符串分析结束,输出界符标示和字符‘#‘,如果则进入下面的分析。

如果ch是NULL或者换行符,则读入下一个字符,如果不是,继续分析。

如果ch是字母,存入text字符数组中,然后继续读入,直到读入的不是字母或者数字。则text数组中存放的是关键字或者标识符,将text中存放的字符数组和关键字比较,如果是关键字则输出关键字标示,如果不是,则输出标识符标示和字符串。读入下一个字符。

如果ch是数字,存入text字符数组中,然后继续读入,直到读入的不是字母数字。则text中存放的是数字,并输入数字标示和字符串。读入下一个字符。

如果ch是除‘:=’外的运算符,则输出运算符标示和字符。如果ch是‘:’,判断下一个字符是不是‘=’,如果是,则输出运算符标示和‘:=’,如果不是,则输出出错。读入下一个字符。

如果ch是界符,则输出界符标示和字符。读入下一个字符。

4、实验结果

实验结果如下:

begin

x:=9;

if x>0 then x:=2*x+1/3;

end#

运行结果如下:

5、实验心得

在第一次做这个实验的那个下午,做出来的没有现在这样完善,当时只能分析一行代码,现在可以换行输入。

其实这个实验最重要的就是分类比较复杂,分支比较多,如果不注意就会因为分类的问题而出错,把我好这一点就能掌握做好这个程序的精髓。

当然现在这个程序本身也存在着许多不完备的地方,比如不能读文件,而且对于查错也做的不是很好(我只是写了一下出错提示,不能显示哪一行出错了)......

如此而已......

程序源代码如下:#include

#include

#include

#include

#include

#include

char Getchar(char* &p){

char ch;

ch=*(p++);

return ch;

}

void main(){

char expression[100],*pExpression,text[20];

char ch=' ';

int i=0;

scanf("%c",&expression[0]);

while(expression[i]!='#'){

i=i+1;

scanf("%c",&expression[i]);

}//输入源程序串

pExpression=expression;

ch=Getchar(pExpression);

while(ch!='#'){//大循环开始

if(ch==' '||ch=='\t'||ch=='\n') ch=Getchar(pExpression);

else{

if(isalpha(ch)){//开头是字母

for(i=0;i

i=0;

while(isalpha(ch)||isdigit(ch))

{

text[i]=ch;

i++;

ch=Getchar(pExpression);

}

text[i]='\0';

if(!strcmp(text,"begin")||!strcmp(text,"if")||!strcmp(text,"then")||!strcmp(text,"end")) printf("3 类型是关键字 %s\n",text);

else printf("1 类型是标识符 %s\n",text);

}

else{ //是数字

for(i=0;i

text[i]='\0';

i=0;

if(isdigit(ch)){

while(isdigit(ch)){

text[i]=ch;

i++;

ch=Getchar(pExpression);

}

printf("2 类型是常数 %s\n",text);

}

else{//是运算符(除了运算符:=)

if(ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='')

{printf("4 类型是运算符 %c\n",ch);ch=Getchar(pExpression);}

else{//是运算符:=

if(ch==':'){ if(Getchar(pExpression)=='=') {printf("4 类型是运算符 :=\n");ch=Getchar(pExpression);}

else { printf("Error =\n"); ch=Getchar(pExpression);} }

else{//是界符

if(ch==';'||ch=='('||ch==')'){printf("5 类型是界符 %c\n",ch);ch=Getchar(pExpression);}

else {printf("Error\n"); ch=Getchar(pExpression);}

}//是界符结束

}//是运算符结束

}

}

}

}//while循环结束

printf("5 类型是界符 #\n");

}//mian函数结束


相关文章

  • 编译原理上机报告
  • 编译原理上机报告 组员: 班级: 一.上机题目: 实现一个简单的语言(Core Programming Language,CPL )的编译器(解释器) (或者其他自己想完成的编译器) 二.上机目的 加深编译原理基础知识的理解:词法分析.语法 ...查看


  • 编译原理实验指导书---2014年修订版
  • 编译原理实验指导 石家庄经济学院信息工程学院 2014-01-25 "编译原理"是计算机类专业一门理论性和实践性强的专业课程,在本专业的课程体系中处于十分重要的地位,属于必修课.本课程的内容主要介绍高级程序设计语言实现的 ...查看


  • 词法分析器编译原理C++实现实验报告
  • 学 生 实 验 报 告 学 院: 软件与通信工程学院 课程名称: 编译原理 专业班级: 姓 名: 学 号: 学生实验报告 一.实验综述 1.实验目的及要求 使用任意语言实现词法分析器 2.实验仪器.设备或软件 Visual C++. 二.实 ...查看


  • 词法分析器实验报告
  • 杭州电子科技大学 班级:12052312 专业:计算机科学与技术 实 验 报 告 [实验名称] 实验一词法分析实验 一.实验目的 设计.编制并调试一个词法分析程序,加深对词法分析原理的理解. 二.实验内容 2.1 待分析的简单词法 (1)关 ...查看


  • 浙江理工大学编译原理实验一
  • 2015-2016学年第一学期<编译原理>实验一 实验报告 13计科3 夏以彬 [1**********]3 一.实验目的 1.构造一个<科学计算器>的词法分析程序,程序要求能对输入的字符串流进行词法分析. 2.在实 ...查看


  • 编译原理上机实验
  • 实验1简单的词法分析子程序 [实验目的] ● 理解词法分析在编译程序中的作用 ● 初步了解和掌握词法分析程序的实现方法和技术 [实验内容] 1. 编写程序,输入一串字符,判断该字符串是否为合法标识符或合法整型常量. 2. 无符号数的算术四则 ...查看


  • 编译原理-编写递归下降语法分析器
  • 编译原理上机报告 名 称: 编写递归下降语法分析器 学 院: 信息与控制工程学院 专 业: 计算机科学与技术 班 级: 计算机1401班 姓 名: 叶达成 年 月 一.上机目的 通过设计.编制.调试一个递归下降语法分析程序,实现对词法分析程 ...查看


  • 编译原理上机安排及报告说明
  • 一.上机说明 1.上机共12小时,分为3次,每次4小时.其中第1次完成词法分析,第2.3次完成语法分析. 2.上机时间: 1班:11.25下午.12.23下午.12.24晚上 2班:12.2下午.12.23晚上.12.25上午 3班:11. ...查看


  • 语法分析程序的设计与实现
  • 语法分析程序的设计与实现 一:实验内容: ................................................................................................... ...查看


热门内容