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

  • 格式:doc
  • 大小:89.00 KB
  • 文档页数:7

下载文档原格式

  / 15
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

北华航天工业学院

《编译原理》课程实验报告

课程实验题目:词法分析器实验

作者所在系部:计算机科学与工程系

作者所在专业:计算机科学与技术

作者所在班级: 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.实验方案设计

2.程序源代码

#include<>

#include<>

#include

#include

using namespace std;

string

keywords[20]={"include","void","main","int","char","float","double","if","else" ,"then","break","continue","for","do","while","printf","scanf","begin","end","r eturn"};

char aa[99999]=" ";

string id[10000];

int pp=0;

string nu[10000];

int qq=0;

void initscanner() _str(),wordbuf)==0) flag=1;

}

if(flag==0)

{

int flagg=-1;

for(int t=0;t

{

if(strcmp(id[t].c_str(),wordbuf)==0) {

flagg=t;

}

}

if(flagg!=-1) printf(" (id,%d) ",flagg);

else

{

id[pp]=wordbuf;

printf(" (id,%d) ",pp);

pp++;

}

}

else

{

printf(" (");

for(int i=0;i

{

printf("%c",wordbuf[i]);

}

printf(",-) ");

}

return st;

}

int isnumber(int st) )

{

numbuf[n]=aa[st];

k++;

}

else if(decide1(aa[st])==1)

{

numbuf[n]=aa[st];

flag=1;

continue;

}

else break;

}

if(flag==0)

{

int flagg=-1;

for(int t=0;t

if(strcmp(nu[t].c_str(),numbuf)==0)

flagg=t;

if(flagg!=-1) printf(" (nu,%d) ",flagg);

else

{

nu[qq]=numbuf;

printf(" (nu,%d) ",qq);

qq++;

}

}

else

{

printf(" (");

for(int i=0;i

printf(",error digital!) ");

}

return st;

}

int isanotation(int st) : st++;

printf(" (.,-) ");

break;

case ',': 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) ",aa[st]);

st++;

}

return st;

}

int lexscan(int st) //根据读入的单词的第一个字符确定调用不同的单词识别函数{

if(decide1(aa[st])==1)