『易坊知识库摘要_编译|编译原理词法分析器实验报告』二、实验内容及要求1根据状态转换图直接编程编写一个词法分析程序,它从左到右逐个字符的对源程序进行扫描,产生一个个的单词的二元式,形成二元式(记号)流文件输出。在此,...
按关键词阅读:
原理
编译
报告
实验
分析器
词法
1、北华航天工业学院编译原理课程实验报告课程实验题目: 词法分析器实验 作者所在系部: 计算机科学与工程系 作者所在专业: 计算机科学与技术 作者所在班级: B08512 作 者 学 号: 18 作 者 姓 名 : 李桂丁 指导教师姓名: 李建义 完 成 时 间 : 2010年3月26日 一、实验目的了解词法分析程序的两种设计方法:1.根据状态转换图直接编程的方式;2.利用DFA编写通用的词法分析程序 。
二、实验内容及要求1根据状态转换图直接编程编写一个词法分析程序 , 它从左到右逐个字符的对源程序进行扫描 , 产生一个个的单词的二元式 , 形成二元式(记号)流文件输出 。
在此 , 词法分析程序作为单独的一遍 , 如下图 。
2、所示 。
具体任务有:(1)组织源程序的输入(2)拼出单词并查找其类别编号 , 形成二元式输出 , 得到单词流文件(3)删除注释、空格和无用符号(4)发现并定位词法错误 , 需要输出错误的位置在源程序中的第几行 。
将错误信息输出到屏幕上 。
(5)对于普通标识符和常量 , 分别建立标识符表和常量表(使用线性表存储) , 当遇到一个标识符或常量时 , 查找标识符表或常量表 , 若存在 , 则返回位置 , 否则返回0并且填写符号表或常量表 。
标识符表结构:变量名 , 类型(整型、实型、字符型) , 分配的数据区地址注:词法分析阶段只填写变量名 , 其它部分在语法分析、语义分析、代码生成等阶段逐步填入 。
常量表结构:常量名 , 常量值2能对任何S语言源程序进行分析 。
3、在运行词法分析程序时 , 应该用问答形式输入要被分析的S源语言程序的文件名 , 然后对该程序完成词法分析任务 。
3能检查并处理某些词法分析错误词法分析程序能给出的错误信息包括:总的出错个数 , 每个错误所在的行号 , 错误的编号及错误信息 。
4.本实验要求处理以下两种错误(编号分别为1 , 2):1:非法字符:单词表中不存在的字符处理为非法字符 , 处理方式是删除该字符 , 给出错误信息 , “某某字符非法” 。
2:源程序文件结束而注释未结束 。
注释格式为:/* */三、实验程序设计说明1实验方案设计2程序源代码#include#include#include#includeusing namespace std;
string ke 。
4、ywords20=include,void,main,int,char,float,double,if,else,then,break,continue,for,do,while,printf,scanf,begin,end,return;
char aa99999= ;
string id10000;
int pp=0;
string nu10000;
int qq=0;
void initscanner() /程序初始化:输入并打开源程序文件和目标程序文件 , 初始化保留字表int i=0;
FILE *fp;
if(fp=fopen(a.txt,r)=NULL)printf(Open error!);
exi 。
5、t(0);
char ch=fgetc(fp);
while(ch!=EOF)aai=ch;
i+;
ch=fgetc(fp);
fclose(fp);
int decide1(char a) /判断是否是字母if(a=a&a=A&a=0&a: st+;
if(aast=)st+;
printf( (rlop,=) );
else printf( (rlop,) );
break;
case : st+;
if(aast=) st+;
printf( (rlop,=) );
else printf( (rlop,) );
break;
case %: st+;
if(aast=)st+;
printf( (%=,-) );
els 。
6、e printf( (%,-) );
break;
case !: st+;
if(aast=)st+;
printf( (!=,-) );
else printf( (!,wrong thing!) );
break;
case &: st+;
if(aast=&)st+;
printf( (&,-) );
else printf( (&,worng word!) );
break;
case |: st+;
if(aast=|)st+;
printf( (|,-) );
else printf( (|,worng word!) );
break;
case : st+;
printf( (,-) );
break;
case : 。
7、 st+;
printf( (,-) );
break;
case (: st+;
printf( (,-) );
break;
case ): st+;
printf( (),-) );
break;
case : st+;
printf( (,-) );
break;
case : st+;
printf( (,-) );
break;
case : st+;
printf( (:,-) );
break;
case #: st+;
printf( (#,-) );
break;
case ;
: st+;
printf( (;
,-) );
break;
case .: st+;
printf( (.,-) );
break;
case ,:。
8、st+;
printf( (,-) );
break;
case : st+;
break;
case : st+;
break;
case 10: st+;
printf(n);
break;
case 34: st+;
printf( (,-) );
break;
case 39: st+;
printf( (,-) );
break;
default: printf( (%c,worng thing) ,aast);
st+;
return st;
int lexscan(int st) /根据读入的单词的第一个字符确定调用不同的单词识别函数if(decide1(aast)=1)st=isalpha(st);
else if( 。
9、decide2(aast)=1)st=isnumber(st);
else if(aast=/)st=isanotation(st);
else st=isother(st);
return st;
void scanner() /若文件未结束 , 反复调用lexscan函数识别单词int i=0;
来源:(未知)
【傻大方】网址:http://www.shadafang.com/a/2020/1223/002661775.html
标题:编译|编译原理词法分析器实验报告