文档库 最新最全的文档下载
当前位置:文档库 › 实验一 编译预处理和词法分析

实验一 编译预处理和词法分析

实验一  编译预处理和词法分析
实验一  编译预处理和词法分析

实验一编译预处理和词法分析

实验目的:

1. 从编译程序的角度理解程序设计语言,并进行编译的预处理。

2. 识别程序设计语言源程序的单词符号。

实验内容:

项目1、编写程序,输入为某一C语言源程序

(1)输出的结果不对源程序行改变,仅去掉所有注释的内容;

(2)把C语言中定义的符号常量能采用对应的常量来替换。#DEFINE PI 3.14

项目2、参考:本教材P32描写TEST语言的单词符号;P218附录B的词法分析程序。编写程序,输入为某一TEST语言源程序,能分别输出所有标识符、保留字、无符号整数、分界符。(通过修改附录B的词法分析程序,添加保留字do,双分界符&&和||以及单分界符!的处理)。

实验报告:

每位同学撰写一份试验报告,并提交电子版的源程序和报告。

实验报告的要求:

项目1:源程序、流程图、运行结果的截图

项目2:源程序、流程图、运行结果的截图

实验报告命名规则:

个人:2013-14(1)医智(1)1107505101蔡菲菲实验一

交各班课代表汇总后,由课代表打包后,发送至老师的邮箱

班级命名规则:2013-14医智(1)实验一

截止日期:第14周周五晚11点30分

实验提示:

(项目1)以下是一个C++程序,请试着写出它的功能。

#include

#include

void pro_process(char *);

void main()

{

char buf[4048]={'\0'};

pro_process(buf);

cout<

}

void pro_process(char *buf)

{

ifstream cinf("source.txt",ios::in);

int i=0;

char old_c='\0',cur_c;

bool in_comment=false;

while(cinf.read(&cur_c,sizeof(char))) {

switch(in_comment){

case false:

if(old_c=='/'&&cur_c=='*'){

i--;

in_comment=true;

}

else{

if(old_c=='\\'&& cur_c=='\n') i--;

else{

if(cur_c>='A'&&cur_c<='Z')

cur_c+=32;

if(cur_c=='\t'||cur_c=='\n') cur_c=' ';

buf[i++] =cur_c;

}

}

break;

case true:

if(old_c=='*'&&cur_c=='/')

in_comment=false;

}

old_c=cur_c;

}

buf[i++]='#';

}

修改后(1)

#include

#include

#include

usingnamespace std;

void pro_process(char *);

void main()

{

char buf[4048]={'\0'};

pro_process(buf);

cout<

{system("pause");

}

}

void pro_process(char *buf)

{

ifstream cinf("source.txt",ios::in);

int i=0,j=0,a=0;

char old_c='\0',cur_c;

bool in_comment=false;

while(cinf.read(&cur_c,sizeof(char)))

{

switch(in_comment)

{

casefalse:

if(old_c=='/'&&cur_c=='*')

{

i--;

in_comment=true;

}

elseif(old_c=='P'&&cur_c=='I')

{

i--;

j=1;

in_comment=true;

}

else

{

if(old_c=='/'&& cur_c=='/')

{

a=1;

i--;

in_comment=true;

break;

}

else

{

buf[i++] =cur_c;

}

}

break;

casetrue:

if(old_c=='*'&&cur_c=='/')

in_comment=false;

if(a)

{

if(cur_c=='\n')

{ a=0;

in_comment=false;

}

}

if(j)

{ j=0;

buf[i++] ='3';

buf[i++] ='.';

buf[i++] ='1';

buf[i++] ='4';

buf[i++] =cur_c;

in_comment=false;

}

}

old_c=cur_c;

}

buf[i++]='#';

}

流程图:

原文本:

执行后结果:

TESTscan:

#include

#include

#include

//下面定义保留,为简化程序,使用字符指针数组保存所有保留字。

//如果想增加保留字,可继续添加,并修改保留字数目

#define keywordSum 11

char

*keyword[keywordSum]={ "if","else","for","while","do","int","read","write","main","printf","incl ude"};

//下面定义纯单分界符,如需要可添加

char singleword[50]="+-*(){};,:!";

//下面定义双分界符的首字符

char doubleword[10]="><=!|&";

extern char Scanin[300], Scanout[300]; //用于接收输入输出文件名,在TEST_main.c中定义extern FILE *fin,*fout; //用于指向输入输出文件的指针,在TEST_main.c中定义

int TESTscan()//词法分析函数

{

char ch,token[40]; //ch为每次读入的字符,token用于保存识别出的单词

int es=0,j,n; //es错误代码,0表示没有错误。j,n为临时变量,控制组合单词时的下标等printf("请输入源程序文件名(包括路径):");

scanf("%s",Scanin);

printf("请输入词法分析输出文件名(包括路径):");

scanf("%s",Scanout);

if ((fin=fopen(Scanin,"r"))==NULL) //判断输入文件名是否正确

{

printf("\n打开词法分析输入文件出错!\n");

return(1);//输入文件出错返回错误代码1

}

if ((fout=fopen(Scanout,"w"))==NULL) //判断输出文件名是否正确

{

printf("\n创建词法分析输出文件出错!\n");

return(2); //输出文件出错返回错误代码2

}

ch=getc(fin);

while(ch!=EOF)

{

while (ch==' '||ch=='\n'||ch=='\t') ch=getc(fin);

if (ch==EOF) break;

if (isalpha(ch)) //如果是字母,则进行标识符处理

{

token[0]=ch; j=1;

ch=getc(fin);

while(isalnum(ch)) //如果是字母数字则组合标识符;如果不是则标识符组合结束

{

token[j++]=ch; //组合的标识符保存在token中

ch=getc(fin); //读下一个字符

}

token[j]='\0'; //标识符组合结束

//查保留字

n=0;

while ((n

if (n>=keywordSum) //不是保留字,输出标识符

fprintf(fout,"%s\t%s\n","ID",token); //输出标识符符号

else//是保留字,输出保留字

fprintf(fout,"%s\t%s\n",token,token); //输出保留字符号

} else if (isdigit(ch))//数字处理

{

token[0]=ch; j=1;

ch=getc(fin); //读下一个字符

while (isdigit(ch)) //如果是数字则组合整数;如果不是则整数组合结束{

token[j++]=ch; //组合整数保存在token中

ch=getc(fin); //读下一个字符

}

token[j]='\0'; //整数组合结束

fprintf(fout,"%s\t%s\n","NUM",token); //输出整数符号

} else if (strchr(singleword,ch)>0) //单分符处理

{

token[0]=ch; token[1]='\0';

ch=getc(fin);//读下一个符号以便识别下一个单词

fprintf(fout,"%s\t%s\n",token,token); //输出单分界符符号

}else if (strchr(doubleword,ch)>0) //双分界符处理

{

token[0]=ch;

ch=getc(fin); //读下一个字符判断是否为双分界符

if (ch=='=') //如果是=,组合双分界符

{

token[1]=ch;token[2]='\0'; //组合双分界符结束

ch=getc(fin); //读下一个符号以便识别下一个单词

} else//不是=则为单分界符

token[1]='\0';

fprintf(fout,"%s\t%s\n",token,token); //输出单或双分界符符号

} else if (ch=='/') //注释处理

{

ch=getc(fin); //读下一个字符

if (ch=='*') //如果是*,则开始处理注释

{ char ch1;

ch1=getc(fin); //读下一个字符

do

{ ch=ch1;ch1=getc(fin);} //删除注释

while ((ch!='*' || ch1!='/')&&ch1!=EOF); //直到遇到注释结束符*/或文件尾

ch=getc(fin);//读下一个符号以便识别下一个单词

} else //不是*则处理单分界符/

{

token[0]='/'; token[1]='\0';

fprintf(fout,"%s\t%s\n",token,token); //输出单分界符/

}

} else//错误处理

{

token[0]=ch;token[1]='\0';

ch=getc(fin); //读下一个符号以便识别下一个单词

es=3; //设置错误代码

fprintf(fout,"%s\t%s\n","ERROR",token); //输出错误符号

}

}

fclose(fin);//关闭输入输出文件

fclose(fout);

return(es); //返回主程序

}

流程图:

原文本:

经过词法分析:

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

编译原理实验报告实验名称:实验一编写词法分析程序 实验类型:验证型实验 指导教师:何中胜 专业班级:13软件四 姓名:丁越 学号: 电子邮箱: 实验地点:秋白楼B720 实验成绩: 日期:2016年3 月18 日

一、实验目的 通过设计、调试词法分析程序,实现从源程序中分出各种单词的方法;熟悉词法分析 程序所用的工具自动机,进一步理解自动机理论。掌握文法转换成自动机的技术及有穷自动机实现的方法。确定词法分析器的输出形式及标识符与关键字的区分方法。加深对课堂教学的理解;提高词法分析方法的实践能力。通过本实验,应达到以下目标: 1、掌握从源程序文件中读取有效字符的方法和产生源程序的内部表示文件的方法。 2、掌握词法分析的实现方法。 3、上机调试编出的词法分析程序。 二、实验过程 以编写PASCAL子集的词法分析程序为例 1.理论部分 (1)主程序设计考虑 主程序的说明部分为各种表格和变量安排空间。 数组 k为关键字表,每个数组元素存放一个关键字。采用定长的方式,较短的关键字 后面补空格。 P数组存放分界符。为了简单起见,分界符、算术运算符和关系运算符都放在 p表中 (编程时,还应建立算术运算符表和关系运算符表,并且各有类号),合并成一类。 id和ci数组分别存放标识符和常数。 instring数组为输入源程序的单词缓存。 outtoken记录为输出内部表示缓存。 还有一些为造表填表设置的变量。 主程序开始后,先以人工方式输入关键字,造 k表;再输入分界符等造p表。 主程序的工作部分设计成便于调试的循环结构。每个循环处理一个单词;接收键盘上 送来的一个单词;调用词法分析过程;输出每个单词的内部码。 ⑵词法分析过程考虑 将词法分析程序设计成独立一遍扫描源程序的结构。其流程图见图1-1。 图1-1 该过程取名为 lexical,它根据输入单词的第一个字符(有时还需读第二个字符),判断单词类,产生类号:以字符 k表示关键字;i表示标识符;c表示常数;p表示分界符;s表示运算符(编程时类号分别为 1,2,3,4,5)。 对于标识符和常数,需分别与标识符表和常数表中已登记的元素相比较,如表中已有 该元素,则记录其在表中的位置,如未出现过,将标识符按顺序填入数组id中,将常数 变为二进制形式存入数组中 ci中,并记录其在表中的位置。 lexical过程中嵌有两个小过程:一个名为getchar,其功能为从instring中按顺序取出一个字符,并将其指针pint加1;另一个名为error,当出现错误时,调用这个过程, 输出错误编号。 2.实践部分

编译原理实验--词法分析器

编译原理实验--词法分析器 实验一词法分析器设计 【实验目的】 1(熟悉词法分析的基本原理,词法分析的过程以及词法分析中要注意的问题。 2(复习高级语言,进一步加强用高级语言来解决实际问题的能力。 3(通过完成词法分析程序,了解词法分析的过程。 【实验内容】 用C语言编写一个PL/0词法分析器,为语法语义分析提供单词,使之能把输入的字符 串形式的源程序分割成一个个单词符号传递给语法语义分析,并把分析结果(基本字, 运算符,标识符,常数以及界符)输出。 【实验流程图】

【实验步骤】 1(提取pl/0文件中基本字的源代码 while((ch=fgetc(stream))!='.') { int k=-1; char a[SIZE]; int s=0; while(ch>='a' && ch<='z'||ch>='A' && ch<='Z') { if(ch>='A' && ch<='Z') ch+=32; a[++k]=(char)ch; ch=fgetc(stream); } for(int m=0;m<=12&&k!=-1;m++) for(int n=0;n<=k;n++) {

if(a[n]==wsym[m][n]) ++s; else s=0; if(s==(strlen(wsym[m]))) {printf("%s\t",wsym[m]);m=14;n=k+1;} } 2(提取pl/0文件中标识符的源代码 while((ch=fgetc(stream))!='.') { int k=-1; char a[SIZE]=" "; int s=0; while(ch>='a' && ch<='z'||ch>='A' && ch<='Z') { if(ch>='A' && ch<='Z') ch+=32; a[++k]=(char)ch; ch=fgetc(stream); } for(int m=0;m<=12&&k!=-1;m++) for(int n=0;n<=k;n++) { if(a[n]==wsym[m][n]) ++s; else s=0; if(s==(strlen(wsym[m]))) {m=14;n=k+1;} } if(m==13) for(m=0;a[m]!=NULL;m++) printf("%c ",a[m]);

实验1-3-《编译原理》词法分析程序设计方案

实验1-3 《编译原理》S语言词法分析程序设计方案 一、实验目的 了解词法分析程序的两种设计方法之一:根据状态转换图直接编程的方式; 二、实验内容 1.根据状态转换图直接编程 编写一个词法分析程序,它从左到右逐个字符的对源程序进行扫描,产生一个个的单词的二元式,形成二元式(记号)流文件输出。在此,词法分析程序作为单独的一遍,如下图所示。 具体任务有: (1)组织源程序的输入 (2)拼出单词并查找其类别编号,形成二元式输出,得到单词流文件 (3)删除注释、空格和无用符号 (4)发现并定位词法错误,需要输出错误的位置在源程序中的第几行。将错误信息输出到屏幕上。 (5)对于普通标识符和常量,分别建立标识符表和常量表(使用线性表存储),当遇到一个标识符或常量时,查找标识符表或常量表,若存在,则返回位置,否则返回0并且填写符号表或常量表。 标识符表结构:变量名,类型(整型、实型、字符型),分配的数据区地址 注:词法分析阶段只填写变量名,其它部分在语法分析、语义分析、代码生成等阶段逐步填入。 常量表结构:常量名,常量值 三、实验要求 1.能对任何S语言源程序进行分析 在运行词法分析程序时,应该用问答形式输入要被分析的S源语言程序的文件名,然后对该程序完成词法分析任务。 2.能检查并处理某些词法分析错误 词法分析程序能给出的错误信息包括:总的出错个数,每个错误所在的行号,错误的编号及错误信息。 本实验要求处理以下两种错误(编号分别为1,2): 1:非法字符:单词表中不存在的字符处理为非法字符,处理方式是删除该字符,给出错误信息,“某某字符非法”。 2:源程序文件结束而注释未结束。注释格式为:/* …… */ 四、保留字和特殊符号表

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

编译技术实验报告 实验题目:词法分析 学院:信息学院 专业:计算机科学与技术学号: 姓名:

一、实验目的 (1)理解词法分析的功能; (2)理解词法分析的实现方法; 二、实验内容 PL0的文法如下 …< >?为非终结符。 …::=? 该符号的左部由右部定义,可读作“定义为”。 …|? 表示…或?,为左部可由多个右部定义。 …{ }? 表示花括号内的语法成分可以重复。在不加上下界时可重复0到任意次 数,有上下界时可重复次数的限制。 …[ ]? 表示方括号内的成分为任选项。 …( )? 表示圆括号内的成分优先。 上述符号为“元符号”,文法用上述符号作为文法符号时需要用引号…?括起。 〈程序〉∷=〈分程序〉. 〈分程序〉∷= [〈变量说明部分〉][〈过程说明部分〉]〈语句〉 〈变量说明部分〉∷=V AR〈标识符〉{,〈标识符〉}:INTEGER; 〈无符号整数〉∷=〈数字〉{〈数字〉} 〈标识符〉∷=〈字母〉{〈字母〉|〈数字〉} 〈过程说明部分〉∷=〈过程首部〉〈分程序〉{;〈过程说明部分〉}; 〈过程首部〉∷=PROCEDURE〈标识符〉; 〈语句〉∷=〈赋值语句〉|〈条件语句〉|〈过程调用语句〉|〈读语句〉|〈写语句〉|〈复合语句〉|〈空〉 〈赋值语句〉∷=〈标识符〉∶=〈表达式〉 〈复合语句〉∷=BEGIN〈语句〉{;〈语句〉}END 〈条件〉∷=〈表达式〉〈关系运算符〉〈表达式〉 〈表达式〉∷=〈项〉{〈加法运算符〉〈项〉} 〈项〉∷=〈因子〉{〈乘法运算符〉〈因子〉} 〈因子〉∷=〈标识符〉|〈无符号整数〉|'('〈表达式〉')' 〈加法运算符〉∷=+|- 〈乘法运算符〉∷=* 〈关系运算符〉∷=<>|=|<|<=|>|>= 〈条件语句〉∷=IF〈条件〉THEN〈语句〉 〈字母〉∷=a|b|…|X|Y|Z 〈数字〉∷=0|1|2|…|8|9 实现PL0的词法分析

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

词法分析器实验报告 一、实验目的 选择一种编程语言实现简单的词法分析程序,设计、编制并调试一个词法分析程序,加深对词法分析原理的理解。 二、实验要求 待分析的简单的词法 (1)关键字: begin if then while do end 所有的关键字都是小写。 (2)运算符和界符 : = + - * / < <= <> > >= = ; ( ) # (3)其他单词是标识符(ID)和整型常数(SUM),通过以下正规式定义: ID = letter (letter | digit)* NUM = digit digit* (4)空格有空白、制表符和换行符组成。空格一般用来分隔ID、SUM、运算符、界符和关键字,词法分析阶段通常被忽略。 各种单词符号对应的种别码: 表各种单词符号对应的种别码 词法分析程序的功能: 输入:所给文法的源程序字符串。 输出:二元组(syn,token或sum)构成的序列。 其中:syn为单词种别码; token为存放的单词自身字符串; sum为整型常数。 例如:对源程序begin x:=9: if x>9 then x:=2*x+1/3; end #的源文件,经过词法分析后输出如下序列: (1,begin)(10,x)(18,:=)(11,9)(26,;)(2,if)…… 三、词法分析程序的算法思想: 算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根

据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。 主程序示意图: 主程序示意图如图3-1所示。其中初始包括以下两个方面: ⑴关键字表的初值。 关键字作为特殊标识符处理,把它们预先安排在一张表格中(称为关键字表),当扫描程序识别出标识符时,查关键字表。如能查到匹配的单词,则该单词为关键字,否则为一般标识符。关键字表为一个字符串数组,其描述如下: Char *rwtab[6] = {“begin”, “if”, “then”, “while”, “do”, “end”,}; 图3-1 (2)程序中需要用到的主要变量为syn,token和sum 扫描子程序的算法思想: 首先设置3个变量:①token用来存放构成单词符号的字符串;②sum用来整型单词;③syn 用来存放单词符号的种别码。扫描子程序主要部分流程如图3-2所示。

编译原理实验词法分析语法分析

本代码只供学习参考: 词法分析源代码: #include #include #include using namespace std; string key[8]={"do","end","for","if","printf","scanf","then","while"}; string optr[4]={"+","-","*","/"}; string separator[6]={",",";","{","}","(",")"}; char ch; //判断是否为保留字 bool IsKey(string ss) { int i; for(i=0;i<8;i++) if(!strcmp(key[i].c_str(),ss.c_str())) return true; return false; } //字母判断函数 bool IsLetter(char c) { if(((c>='a')&&(c<='z'))||((c>='A')&&(c<='Z'))) return true; return false; } //数字判断函数 bool IsDigit(char c) { if(c>='0'&&c<='9') return true; return false; } //运算符判断函数 bool IsOptr(string ss) { int i; for(i=0;i<4;i++) if(!strcmp(optr[i].c_str(),ss.c_str())) return true ; return false; } //分界符判断函数 bool IsSeparator(string ss) { int i; for(i=0;i<6;i++) if(!strcmp(separator[i].c_str(),ss.c_str()))

编译原理词法分析和语法分析报告+代码(C语言版)

信息工程学院实验报告(2010 ~2011 学年度第一学期) 姓名:柳冠天 学号:2081908318 班级:083

词法分析 一、实验目的 设计、编制并调试一个词法分析程序,加深对词法分析原理的理解。 二、实验要求 2.1 待分析的简单的词法 (1)关键字: begin if then while do end 所有的关键字都是小写。 (2)运算符和界符 := + - * / < <= <> > >= = ; ( ) # (3)其他单词是标识符(ID)和整型常数(SUM),通过以下正规式定义: ID = letter (letter | digit)* NUM = digit digit* (4)空格有空白、制表符和换行符组成。空格一般用来分隔ID、SUM、运算符、界符和关键字,词法分析阶段通常被忽略。 2.2 各种单词符号对应的种别码: 表2.1 各种单词符号对应的种别码 2.3 词法分析程序的功能: 输入:所给文法的源程序字符串。 输出:二元组(syn,token或sum)构成的序列。 其中:syn为单词种别码; token为存放的单词自身字符串; sum为整型常数。 例如:对源程序begin x:=9: if x>9 then x:=2*x+1/3; end #的源文件,经过词法分析后输出如下序列: (1,begin)(10,x)(18,:=)(11,9)(26,;)(2,if)…… 三、词法分析程序的算法思想: 算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。 3.1 主程序示意图:

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

实验2 词法分析程序的设计 一、实验目的 掌握计算机语言的词法分析程序的开发方法。 二、实验内容 编制一个能够分析三种整数、标识符、主要运算符和主要关键字的词法分析程序。 三、实验要求 1、根据以下的正规式,编制正规文法,画出状态图; 标识符<字母>(<字母>|<数字字符>)* 十进制整数0 | ((1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9)*) 八进制整数0(1|2|3|4|5|6|7)(0|1|2|3|4|5|6|7)* 十六进制整数0x(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)* 运算符和界符+ - * / > < = ( ) ; 关键字if then else while do 2、根据状态图,设计词法分析函数int scan( ),完成以下功能: 1)从文本文件中读入测试源代码,根据状态转换图,分析出一个单词, 2)以二元式形式输出单词<单词种类,单词属性> 其中单词种类用整数表示: 0:标识符 1:十进制整数 2:八进制整数 3:十六进制整数 运算符和界符,关键字采用一字一符,不编码 其中单词属性表示如下: 标识符,整数由于采用一类一符,属性用单词表示 运算符和界符,关键字采用一字一符,属性为空 3、编写测试程序,反复调用函数scan( ),输出单词种别和属性。 四、实验环境 PC微机 DOS操作系统或Windows 操作系统 Turbo C 程序集成环境或Visual C++ 程序集成环境 五、实验步骤 1、根据正规式,画出状态转换图;

编译原理实验(词法分析)

编译原理实验报告 实验一 实验题目:词法分析 指导老师:任姚鹏 专业班级:计算机科学与技术系网络工程方向1002班姓名:xxxx

2013年 4月13日 实验类型__验证性__ 实验室_软件实验室三__ 一、实验项目的目的和任务: 了解和掌握词法分析的方法,编程实现给定源语言程序的词法分析器,并利用该分析器扫描源语言程序的字符串,按照给定的词法规则,识别出单词符号作为输出,发现其中的词法错误。 二、实验内容: 1.设计一个简单的程序设计语言(语言中有若干运算符和分界符;有若干关健字;若干标识符及若干常数) 2.确定编译中使用的表格、词法分析器的输出形式、标识符与关键字的区分方法。 3.把词法分析器设计成一个独立的过程。 三、实验要求: 1.从键盘上输入源程序; 2.处理各单词,计算个单词的值和类型; 3.输出个单词名、单词的值和类型。 四、实验代码 #include #include char file[1024]; int length=0; int index; char keywords[][10]={"auto","short","int","long","float", "double","char","struct","union","enum", "typedef","const","unsigned","signed","extern", "register","static","volatile","void","default", "if","else","switch","case","for", "do","while","goto","continue","break", "sizeof","return"}; char limits[]={'(',')','[',']','{','}',',',';'}; char operators[]={'+', '-', '*', '/', '%', '>','<','&','|','^', '~','!','='}; //13 int IsChar(char ch) //是否是字符 { if ( (ch>='a'&&ch<='z') || (ch>='A'&&ch<='Z')) return 1; return 0;}

编译原理实验报告(词法分析器语法分析器)

编译原理实验报告

实验一 一、实验名称:词法分析器的设计 二、实验目的:1,词法分析器能够识别简单语言的单词符号 2,识别出并输出简单语言的基本字.标示符.无符号整数.运算符.和界符。 三、实验要求:给出一个简单语言单词符号的种别编码词法分析器 四、实验原理: 1、词法分析程序的算法思想 算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。 2、程序流程图 (1 (2)扫描子程序

3

五、实验内容: 1、实验分析 编写程序时,先定义几个全局变量a[]、token[](均为字符串数组),c,s( char型),i,j,k(int型),a[]用来存放输入的字符串,token[]另一个则用来帮助识别单词符号,s用来表示正在分析的字符。字符串输入之后,逐个分析输入字符,判断其是否‘#’,若是表示字符串输入分析完毕,结束分析程序,若否则通过int digit(char c)、int letter(char c)判断其是数字,字符还是算术符,分别为用以判断数字或字符的情况,算术符的判断可以在switch语句中进行,还要通过函数int lookup(char token[])来判断标识符和保留字。 2 实验词法分析器源程序: #include #include #include int i,j,k; char c,s,a[20],token[20]={'0'}; int letter(char s){ if((s>=97)&&(s<=122)) return(1); else return(0); } int digit(char s){ if((s>=48)&&(s<=57)) return(1); else return(0); } void get(){ s=a[i]; i=i+1; } void retract(){ i=i-1; } int lookup(char token[20]){ if(strcmp(token,"while")==0) return(1); else if(strcmp(token,"if")==0) return(2); else if(strcmp(token,"else")==0) return(3); else if(strcmp(token,"switch")==0) return(4); else if(strcmp(token,"case")==0) return(5); else return(0); } void main() { printf("please input string :\n"); i=0; do{i=i+1; scanf("%c",&a[i]);

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

编译原理词法分析程序实现实验报告实验一词法分析程序实现 一、实验内容 选取无符号数的算术四则运算中的各类单词为识别对象,要求将其中的各个单词识别出来。输入:由无符号数和+,,,*,/, ( , ) 构成的算术表达式,如 1.5E+2,100。输出:对识别出的每一单词均单行输出其类别码(无符号数的值暂不要求计算)。二、设计部分 因为需要选取无符号数的算术四则运算中的各类单词为识别对象,要求将其中的各个单词识别出来,而其中的关键则为无符号数的识别,它不仅包括了一般情况下的整数和小数,还有以E为底数的指数运算,其中关于词法分析的无符号数的识别过程流程图如下: 输入字符p指向第一个字符 符号识别*p=+||-||*||/ YYNN*p=0~9*p=E*p=0~9||"." N无效符号Y *p=“.”GOTO 2 GOTO 1 GOTO 1: NY无符号数GOTO 1*p=0~9*p='/0' YN P++NNP++*p=E*p='+'||'-' YY P++P++continue

YY *p=0~9*p=0~9 NN 无符号数无符号数 P++P++ continuecontinue GOTO 2: GOTO 2 *p=Econtinue Y 无符号数 P++ continue 三、源程序代码部分 #include #include #include #define MAX 100 #define UNSIGNEDNUMBER 1 #define PLUS 2 #define SUBTRACT 3 #define MULTIPLY 4 #define DIVIDE 5 #define LEFTBRACKET 6 #define RIGHTBRACKET 7 #define INEFFICACIOUSLABEL 8 #define FINISH 111

编译原理实验 词法分析&语法分析程序

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

实验一:词法分析程序 1、实验目的 从左至右逐个字符的对源程序进行扫描,产生一个个单词符号,把字符串形式的源程序改造成单词符号形式的中间程序。 2、实验内容 表C语言子集的单词符号及内码值 单词符号种别编码助记符内码值 while 1 while -- if 2 if -- else 3 else -- switch 4 switch -- case 5 case -- 标识符 6 id id在符号表中的位置 常数7 num num在常数表中的位置 + 8 + -- - 9 - -- * 10 * -- <= 11 relop LE < 11 relop LT == 11 relop LQ = 12 = -- ; 13 ; -- 输入源程序如下 if a==1 a=a+1; else a=a+2; 输出对应的单词符号形式的中间程序 3、实验过程 实验上机程序如下: #include "stdio.h" #include "string.h" int i,j,k; char s ,a[20],token[20]; int letter() { if((s>=97)&&(s<=122))return 1; else return 0; } int Digit() {if((s>=48)&&(s<=57))return 1;

else return 0; } void get() { s=a[i]; i=i+1; } void retract() {i=i-1;} int lookup() { if(strcmp(token, "while")==0) return 1; else if(strcmp(token, "if")==0) return 2; else if(strcmp(token,"else")==0) return 3; else if(strcmp(token,"switch")==0) return 4; else if(strcmp(token,"case")==0) return 5; else return 0; } void main() { printf("please input you source program,end('#'):\n"); i=0; do { i=i+1; scanf("%c",&a[i]); }while(a[i]!='#'); i=1; memset(token,0,sizeof(char)*10); j=0; get(); while(s!='#') { if(s==' '||s==10||s==13) get(); else { switch(s)

东南大学编译原理词法分析器实验报告

词法分析设计 1. 实验目的 通过本实验的编程实践,了解词法分析的任务,掌握词法分析程序设计的原理和构造方法,对编译的基本概念、原理和方法有完整的和清楚的理解,并能正确地、熟练地运用。 2. 实验内容 用C++语言实现对C++语言子集的源程序进行词法分析。通过输入源程序从左到右对字符串进行扫描和分解,依次输出各个单词的内部编码及单词符号自身值;若遇到错误则显示“Error”,然后跳过错误部分继续显示;同时进行标识符登记符号表的管理。 3. 实验原理 本次实验采用NFA->DFA->DFA0的过程: 对待分析的简单的词法(关键词/id/num/运算符/空白符等)先分别建立自己的FA,然后将他们用产生式连接起来并设置一个唯一的开始符,终结符不合并。 待分析的简单的词法 (1)关键字: "asm","auto","bool","break","case","catch","char","class","

const","const_cast"等 (2)界符(查表) ";",",","(",")","[","]","{","}" (3)运算符 "*","/","%","+","-","<<","=",">>","&","^","|","++","--"," +=","-=","*=","/=","%=","&=","^=","|=" relop: (4)其他单词是标识符(ID)和整型常数(SUM),通过正规式定义。 id/keywords: digit: (5)空格有空白、制表符和换行符组成。空格一般用来分隔ID、SUM、运算符、界符和关键字,词法分析阶段通常被忽略。

编译原理实验-词法分析器的设计与实现.docx

南华大学 计算机科学与技术学院实验报告 (2018~2019学年度第二学期) 课程名称编译原理 实验名称词法分析器的设计与 实现 姓名学号 专业班级 地点教师

1.实验目的及要求 实验目的 加深对词法分析器的工作过程的理解;加强对词法分析方法的掌握;能够采用一种编程语言实现简单的词法分析程序;能够使用自己编写的分析程序对简单的程序段进行词法分析。 实验要求 1.对单词的构词规则有明确的定义; 2.编写的分析程序能够正确识别源程序中的单词符号; 3.识别出的单词以<种别码,值>的形式保存在符号表中,正确设计和维护 符号表; 4.对于源程序中的词法错误,能够做出简单的错误处理,给出简单的错误 提示,保证顺利完成整个源程序的词法分析; 2.实验步骤 1.词法分析规则 <标识符>::=<字母>|<标识符><字母>|<标识符><数字> <常数>::=<数字>|<数字序列><数字> <数字序列>::=<数字序列><数字>|<数字>|<.> <字母>::=a|b|c|……|x|y|z <数字>::=0|1|2|3|4|5|6|7|8|9 <运算符>::=<关系运算符>|<算术运算符>|<逻辑运算符>|<位运算符>|<赋值运算符> <算数运算符>::=+|-|*|/|...|-- <关系运算符>::=<|>|!=|>=|<=|== <逻辑运算符>::=&&| || |! <位运算符>::=&| | |! <赋值运算符>::==|+=|-=|/=|*= <分界符>::=,|;|(|)|{|}|:| // |/**/ <保留字>::=main|if|else|while|do|for|...|void

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

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

————————————————————————————————作者:————————————————————————————————日期:

编译原理实验报告 实验名称:编写词法分析程序实验类型:设计性实验 指导教师:***** 专业班级:软件工程1401 姓名:**** 学号:********** 实验地点:东六E座301 实验成绩:_________________ 日期:2016 年5 月8 日

实验一 编写词法分析程序 一、实验目的 1.通过设计、调试词法分析程序,掌握词法分析程序的设计工具(有穷自 动机),进一步理解自动机理论 2.掌握正则文法和正则表达式转换成有穷自动机的方法及有穷自动机实现 的方法 3.确定词法分析程序的输出形式及标识符与关键字的区分方法 4.加深对理论知识的理解 二、实验设计 1.设计原理: 对源程序代码从头到尾扫描,将符合词法语言规则的单词输出,包括:标识符、保留字、无符号整数、分界符、运算符、注释分离;判断程序的词法是否正确 TEST语言的词法规则如下: 1)、标识符:字母打头,后接任意字母或数字。 2)、保留字:标识符的子集,包括:if,else,for,while,do, int,write,read。 3)、无符号整数:由数字组成,但最高位不能为0,允许一位的0。 4)、分界符:(、)、;、{、} 5)、运算符:+、-、*、/、=、<、>、>=、<=、!=、== 6)、注释符:/* */ 2.设计方法: 1)用正则表达式或正则文法描述程序设计语言的词法规则,通常采用 正则表达式;一个正则表达式对应一条词法规则 2)为每个正则表达式构造一个NFA,用来识别正则表达式描述的单词 将每一个NFA合并、化简得到最简的DFA 3)将多个NFA合并为一个NFA 4)将NFA转换成等价的DFA。 5)最小化DFA 6)确定单词的输出形式。 7)化简后的DFA+单词输出形式?构造词法分析程序 3.设计过程:

编译原理实验一词法分析实验报告

专题 1_ 词法分析程序构造原理与实现 李若森 13281132计科1301 一、程序功能描述 [功能]: 完成下述正则文法所描述的C语言子集单词符号的词法分析程序。 [要求]: (1)给出各单词符号的类别编码。 (2)能发现输入串的错误。 (3)将分析所得二元序列输出到中间文件中。 [文法]: <标识符>→c|c<余留标识符> <余留标识符>→d|c <无符号数>→d<余留无符号数>|.<小数部分>|d <余留无符号数>→d<余留无符号数>|.<十进小数>|(E|e)<指数部分>|.|d <十进小数>→(E|e)<指数部分>|d<十进小数>|d <小数部分>→d<十进小数>|d <指数部分>→d<余留指数>|(+|-)<整指数>|d <整指数>→d<余留整指数>|d <余留整指数>→d<余留整指数>|d <算数运算符>→+|-|*|/|++|-- <关系运算符>→>|<|==|>=|<=|!= <逻辑运算符>→!|&&|\|\| <位操作运算符>→>>|<< <赋值运算符>→=|+=|-=|*=|/=|%= <特殊运算符>→,|\(|\)|{|} <分隔符>→; 保留字: void int float double if else for do while [说明]: (1)该语言对大小写不敏感 (2)c代表字母a-z&&A-Z,d代表数字0-9。 (3)?/*..*/?以及?//?为程序注释部分。 (4)文法中‘\’为转义字符

二、主要数据结构描述 pair: 用pair来存储单个二元组。其中第一个元素为类型号,第二个为 元素的值。当类型号小于40时代表程序分界符,第二个元素不存储有效信息,用 ?-?代替;类型号为40时是标识符,第二个元素存储标识符字符串;类型号为41 时代表实数,第二个元素存储的是该实数的二进制值。 vector<>: vector是C++中的动态数组,用来存储每一行的二元组。 三、程序结构描述 设计方法: 状态转换图:(DFA M)

编译原理词法分析器

一、实验目的 了解词法分析程序的两种设计方法:1.根据状态转换图直接编程的方式;2.利用DFA 编写通用的词法分析程序。 二、实验内容及要求 1.根据状态转换图直接编程 编写一个词法分析程序,它从左到右逐个字符的对源程序进行扫描,产生一个个的单词的二元式,形成二元式(记号)流文件输出。在此,词法分析程序作为单独的一遍,如下图所示。 具体任务有: (1)组织源程序的输入 (2)拼出单词并查找其类别编号,形成二元式输出,得到单词流文件 (3)删除注释、空格和无用符号 (4)发现并定位词法错误,需要输出错误的位置在源程序中的第几行。将错误信息输出到屏幕上。 (5)对于普通标识符和常量,分别建立标识符表和常量表(使用线性表存储),当遇到一个标识符或常量时,查找标识符表或常量表,若存在,则返回位置,否则返回0并且填写符号表或常量表。 标识符表结构:变量名,类型(整型、实型、字符型),分配的数据区地址 注:词法分析阶段只填写变量名,其它部分在语法分析、语义分析、代码生成等阶段逐步填入。 常量表结构:常量名,常量值 2.编写DFA模拟程序 算法如下: DFA(S=S0,MOVE[][],F[],ALPHABET[]) /*S为状态,初值为DFA的初态,MOVE[][]为状态转换矩阵,F[] 为终态集,ALPHABET[] 为字母表,其中的字母顺序与MOVE[][] 中列标题的字母顺序一致。*/ { Char Wordbuffer[10]=“”//单词缓冲区置空 Nextchar=getchar();//读 i=0; while(nextchar!=NULL)//NULL代表此类单词 { if (nextcha r!∈ALPHABET[]){ERROR(“非法字符”),return(“非法字符”);} S=MOVE[S][nextchar] //下一状态 if(S=NULL)return(“不接受”);//下一状态为空,不能识别,单词错误 wordbuffer[i]=nextchar ;//保存单词符号 i++; nextchar=getchar(); } Wordbuffer[i]=‘\0’;

编译原理_词法分析器_实验报告

词法分析器实验报告

实验目的: 设计、编制、调试一个词法分析子程序-识别单词,加深对词法分析原理的理解。 功能描述: 该程序要实现的是一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。并依次输出各个单词的内部编码及单词符号自身值。(遇到错误时可显示“Error!”,然后跳过错误部分继续进行) 设计思想: 设计该词法分析器的过程中虽然没有实际将所有的状态转移表建立出来,但是所用的思想是根据状态转移表实现对单词的识别。首先构造一个保留字表,然后,每输入一个字符就检测应该进入什么状态,并将该字符连接到d串后继续输入,如此循环,最后根据所在的接受状态以及保留字表识别单词。 符号表: 记号类别属性值 ws - - const 保留字 1 var 保留字 1 call 保留字 1 begin 保留字 1 if 保留字 1 while 保留字 1 do 保留字 1 odd 保留字 1 end 保留字 1 then 保留字 1 procedure 保留字 1 = 运算符 2 < 运算符 2 <= 运算符 2 <> 运算符 2 > 运算符 2 >= 运算符 2

* 运算符 2 + 运算符 2 - 运算符 2 / 运算符 2 := 运算符 2 ident 标识符 3 number 常数 4 ( 分隔符 5 ) 分隔符 5 ; 分隔符 5 , 分隔符 5 . 分隔符 5 状态转换图: ①标识符及保留字: ②number: ③关系操作符: Start letter letter or digitt 0 2 1 4 3 5 start digit . digit E + | - digit digit digit digit E digit other other

编译原理词法分析器实验报告

北华航天工业学院 《编译原理》课程实验报告 课程实验题目:词法分析器实验 作者所在系部:计算机科学与工程系作者所在专业:计算机科学与技术 作者所在班级:B08512 作者学号:18 作者姓名:李桂丁 指导教师姓名:李建义 完成时间:2010年3月26日

一、实验目的 了解词法分析程序的两种设计方法:1.根据状态转换图直接编程的方式;2.利用DFA 编写通用的词法分析程序。 二、实验内容及要求 1.根据状态转换图直接编程 编写一个词法分析程序,它从左到右逐个字符的对源程序进行扫描,产生一个个的单词的二元式,形成二元式(记号)流文件输出。在此,词法分析程序作为单独的一遍,如下图所示。 具体任务有: (1)组织源程序的输入 (2)拼出单词并查找其类别编号,形成二元式输出,得到单词流文件 (3)删除注释、空格和无用符号 (4)发现并定位词法错误,需要输出错误的位置在源程序中的第几行。将错误信息输出到屏幕上。 (5)对于普通标识符和常量,分别建立标识符表和常量表(使用线性表存储),当遇到一个标识符或常量时,查找标识符表或常量表,若存在,则返回位置,否则返回0并且填写符号表或常量表。 标识符表结构:变量名,类型(整型、实型、字符型),分配的数据区地址 注:词法分析阶段只填写变量名,其它部分在语法分析、语义分析、代码生成等阶段逐步填入。 常量表结构:常量名,常量值 2.能对任何S语言源程序进行分析 在运行词法分析程序时,应该用问答形式输入要被分析的S源语言程序的文件名,然后对该程序完成词法分析任务。 3.能检查并处理某些词法分析错误 词法分析程序能给出的错误信息包括:总的出错个数,每个错误所在的行号,错误的编号及错误信息。 4. 本实验要求处理以下两种错误(编号分别为1,2): 1:非法字符:单词表中不存在的字符处理为非法字符,处理方式是删除该字符,给出错误信息,“某某字符非法”。 2:源程序文件结束而注释未结束。注释格式为:/* …… */

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

计算机硬件实验室实验报告 一、实验目的: 通过设计编制调试一个具体的词法分析程序,加深对词法分析原理的理解。并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。 编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。并依次输出各个单词的内部编码及单词符号自身值。(遇到错误时可显示“Error”,然后跳过错误部分继续显示) 二、实验要求: 识别保留字:if、int、for、while、do、return、break、continue,等C语言的保留字;单词种别码为1。 其他的都识别为标识符;单词种别码为2。 常数为无符号整形数;单词种别码为3。 运算符包括:+、-、*、/、=、>、<、>=、<=、!= ;单词种别码为4。 分隔符包括:,、;、{、}、(、)、[、];单词种别码为5。 三、实验过程: 根据题目要求,初步完成程序过程的设计,模块的划分、变量类型分配。#inlclude int main() { int d,a,c; a=10; c=a+b; printf("%d%d",a,b);; return 0; } 用以上定义的C语言子集的源程序作为词法分析程序的输入数据。在词法分析中,自文件头开始扫描源程序字符,一旦发现符合“单词”定义的源程序字符串时,将它翻译成固定长度的单词内部表示,并查填适当的信息表。经过词法分析后,源程序字符串(源程序的外部表示)被翻译成具有等长信息的单词串(源程序的内部表示),并产生两个表格:常数表和标识符表,它们分别包含了源程序中的所有常数和所有标识符。 0.定义部分:定义常量、变量、数据结构。 1.初始化:从文件将源程序全部输入到字符缓冲区中。 2.取单词前:去掉多余空白。 3.取单词:利用实验一的成果读出单词的每一个字符,组成单词,分析类型。(关键是如何判断取单词结束?取到的单词是什么类型的单词?) 4.显示结果。

编译原理词法分析器实验报告最终版

学院(系)名称:计算机工程系 姓名学号专业班级实验项目实验一:词法分析 课程名称编译原理课程代码 0310243 2013年 4月28 日第 1、2 节实验时间实验地点第一教学楼1508 2013年5月 7 日第1 、2 节 批改意见成绩 教师签字: 实验内容: 实现标准C语言词法分析器 实验目的: 1(掌握程序设计语言词法分析的设计方法; 2(掌握DFA的设计与使用方法; 3(掌握正规式到有限自动机的构造方法; 实验要求: 1(单词种别编码要求 基本字、运算符、界符:一符一种; 标识符:统一为一种; 常量:按类型编码; 2(词法分析工作过程中建立符号表、常量表,并以文本文件形式输出; 3(词法分析的最后结果以文本文件形式输出; 4(完成对所设计词法分析器的功能测试,并给出测试数据和实验结果; 5(为增加程序可读性,请在程序中进行适当注释说明; 6(整理上机步骤,总结经验和体会; 7(认真完成并按时提交实验报告。

实验步骤: 1.基本思想:从源程序中依次读入字符并解析,与关键字、运算符、结束符进行 比较,得出其中的关键字,并将它存入到数组中去。 2.程序源代码: #include #include #include #define MaxSize1 17//关键字的个数 #define MaxSize2 20//运算符的个数 #define MaxSize3 4//结束符的个数 //数据结构 struct TNode { char value[20]; //存放标识符的值 int number; //存放标识符的种别码 char description[20];//描述 }KeyWords[MaxSize1],Operation[MaxSize2],EndOperation[MaxSize3]; //存放关键字的数组 char *WordsBuff[MaxSize1]={"const","long","float","double","void","main", "if","else","then", "break","int","char","include","for","while","printf","scanf"}; //存放运算符的数组 char

相关文档
相关文档 最新文档