当前位置:文档之家› 编译原理实验1报告

编译原理实验1报告

{ //判断该字符是否是字母
TOKEN[0]=ch; ch=fgetc(fp); i=1;
while(isalnum(ch)|| ch == '_')
{
//判断该字符是否是字母或数字或下划线
TOKEN[i++] = ch; ch=fgetc(fp);
} c = lookup(TOKEN);
if(c) out(1,TOKEN);
return 1;
return 0;
}
int is_fengefu(char ch)
{
if(ch == ',' || ch == ';' || ch == '{' || ch == '}' || ch == '(' || ch == ')')
return 1;
return 0;
}
void out(int c,char *TOKEN)
(1)定义部分:定义常量、变量、数据结构。
(2)初始化:从文件将源程序全部输入到字符缓冲区中。
(3)取单词前:去掉多余空白。
(4)取单词:利用实验一的成果读出单词的每一个字符,组成单词,分析类型。
(5)显示结果。
3、为了能设计好程序,注意以下事情:
(1)模块设计:将程序分成合理的多个模块(函数),每个模块做具体的同一事情。
(2)写出(画出)设计方案:模块关系简图、流程图、全局变量、函数接口等。
(3)编程时注意编程风格:空行的使用、注释的使用、缩进的使用等。
4.源程序
#include<string.h>
#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
#include<string.h>
石家庄铁道大学
实验报告
课程名称编译原理信息学院(系) 班级:信1201-2班
试验者姓名董龙洋学号20122793实验日期2014年12月01日
评分教师签名
实验项目名称:实验一词法分析
一、实验目的
通过设计编制调试一个具体的词法分析程序,加深对词法分析原理的理解。并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。
else out(2,TOKEN); fseek(fp,-1,1);
}
else if(isdigit(ch))
{ TOKEN[0]=ch; ch=fgetc(fp); i=1;
while(isdigit(ch) || ch == '.')
{
//判断该字符是否数字
TOKEN[i++] = ch; ch=fgetc(fp);
fprintf(stderr,"error opening.\n"); exit(1);
}
do
{ ch=fgetc(fp);
if(ch=='#')
//文件以#结尾,作为扫描结束条件
break;
if(ch==' '||iscntrl(ch))
//如果是空格,自动跳到下个字符
scanner(fp);
else
}
}
else if(is_fengefu(ch))
{ TOKEN[0] = ch; out(5,TOKEN);
}
}
int main()
{
char ch; FILE *fp;
if((fp=fopen("1.txt","r"))==NULL)
{
//读取文件内容,并返回文件指针,该指针指向文件的第一个字符
{ fseek(fp,-1,1);
//如果不是空格,则回退一个字符并扫描
scanner(fp);
}
}while(ch!='#');
return(0);
}
5.实验截图
五、实验总结
通过本次实验,进一步体会词法分析的过程及步骤,当然还有设计词法分析程序的算法思想。充分理解词法分析的原理,扫描分类的过程。
2、标识符:除保留字外的以字母开头,后跟字母、数字的字符序列;单词种别码为2;
3、常数为无符号整形数;单词种别码为3;
4、运算符包括:+、-、*、/、=;单词种别码为4;
5、分隔符包括:,、;、{、}、(、);单词种别码为5。
三、预习提示
1、词法分析器的功能和输出格式
词法分析器的功能是输入源程序,输出单词符号。词法分析器的单词符号常常表示成以下的二元式(单词种别码,单词符号的属性值)。本实验中,采用的是一类符号一种种别码的方式。
} out(3,TOKEN); fseek(fp,-1,1);
}
else if(is_yunsuanfu(ch))
{ TOKEN[0] = ch; ch = fgetc(fp);
if (ch == '=')
{ TOKEN[1] = ch; out(4,TOKEN);
}
else
{ out(4,TOKEN); fseek(fp,-1,1);
{
//输出函数
printf("(%d, %s)\n",c,TOKEN);
} void scanner(FILE *fp)
{
//扫描函数
char TOKEN[20]={'\0'};
char ch;
int i, c;
ch=fgetc(fp); //获取字符,指针fp并自动指向下一个字符
if(isalpha(ch))
2、各类单词的文法
<标识符>→<字母><字母数字串>
<字母数字串>→<字母><字母数字串>|<数字><字母数字串>|ε
<无符号整数>→<数字>|<数字><无符号整数>
<运算符>→+| - | * | / | =
<界符>→, | ; | ( | ) | { | }
3、模块结构参照教材图2.5词法分析过程GETSYM。
四、实验过程和指导
1、准备
(1)课本有关章节;
(2)编制好程序;
(3)准备多组测试数据。
2、程序思路(仅供参考):
在词法分析中,自文件头开始扫描源程序字符,一旦发现符合“单词”定义的源程序字符串时,将它翻译成固定长度的单词内部表示,并填入适当的信息表。经过词法分析后,源程序字符串(源程序的外部表示)被翻译成具有等长信息的单词串(源程序的内部表示),并产生两个表格:常数表和标识符表,它们分别包含了源程序中的所有常数和所有标识符。
#include <iostream>
char *table[6]={" ","int","if","then","else","return"},TOKEN[20]; //定义保留字
int lookup(char *TOKEN)
{
//保留字匹配函数
int m,i;
for(i=1;i<6;i++)
{
if((m=strcmp(TOKEurn(i);
}
return(0);
}
int is_yunsuanfu(char ch)
{
if(ch == '+' || ch == '-' || ch == '*' || ch == '/' || ch == '>' || ch == '<' || ch == '!'|| ch == '=')
二、实验要求
编制一个读单词过程,源程序为一个文件,读取该文件,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、界符五大类。并依次输出各个单词的内部编码及单词符号自身值。
单词的内部编码如下:
1、保留字:if、int、for、while、do、return、break、continue;单词种别码为1;
相关主题