《编译原理》课程实验要求(词法分析)

时间:2025-04-20

《编译原理》课程

实验报告

题目 词法分析 专业 计算机科学与技术 班级 1 学号

姓名 1111

2013年11月10日

一. 实验序号:《编译原理》词法分析实验

二. 实验题目:词法分析

三. 实验日期:

四. 实验环境(操作系统,开发语言)

操作系统:Windows

开发语言:C

五. 实验要求

1) 将标识符的词法改为“以大写字母或小写字母开头,后面可以跟大写字

母或小写字母或数字或下划线”。

2) 将<条件>中的表示相等关系的单词“=”改为“= =”。

3) 将原来无小数的数改为可以有小数的数。

4) 增加识别字符常量和字符串常量的识别。

六. 实验步骤

1) 用PL/0语言编写测试用例源程序。用C语言编写词法分析程序。

2) 运行词法分析程序,读入PL/0语言的测试用例源程序,进行词法分析。

3) 设立断点,单步运行词法分析程序,依次单个输出单词。分析和理解词

法分析程序,解释词法分析程序中的数据和变量变化的原因和输出结果。

4) 根据上述“实验要求”修改词法分析程序,同时也应修改PL/0语言测试

用例源程序中的相应的单词。

5) 运行修改后的词法分析程序,读入修改后的PL/0语言测试用例源程序,

进行词法分析。

七. 实验结果(测试用例源程序,运行结果截图)

八. 实验体会(词法分析程序修改的地方,解决问题的方法、心得体会等)

1.解决要求一:将标识符的词法改为“以大写字母或小写字母开头,后面可以跟大写字母或小写字母或数字或下划线”。其主要代码如下:

if(cACharacter>='a'&&cACharacter<='z'||cACharacter>='A'&& cACharacter<='Z') //如果当前字符是小写的字母

{//标识符或保留字以a..z开头

nAWordIndex=0;//单词的第一个字符

do{

if(nAWordIndex<MAX_LENGTH_OF_A_WORD)

szAWord[nAWordIndex++]=cACharacter;

//把当前字符放进单词数组里,单词数组下标加一

cACharacter=GetACharacterFromFile();

//从文件中再读取一个字符

}while((cACharacter>='a' && cACharacter<='z' || cACharacter>='0' && cACharacter<='9' || cACharacter>='A' && cACharacter<='Z' || cACharacter=='_') && cACharacter!=EOF);

其中在if语句中增加了以大写字母开头的判断语句,在while中增加了可以跟大写字母或小写字母或数字或下划线

2.解决要求二:将<条件>中的表示相等关系的单词“=”改为“= =”。其主要代码如下:

if(cACharacter=='=')

{

cACharacter=GetACharacterFromFile();

if(cACharacter=='=')

{

g_Words[g_nWordsIndex].eType=EQL;

strcpy(g_Words[g_nWordsIndex].szName,"==");

g_Words[g_nWordsIndex].nLineNo=g_nLineNo;

g_nWordsIndex++;

cACharacter=GetACharacterFromFile();

}

else

{//单词仅是"="

g_Words[g_nWordsIndex].eType=FUZHI;

//单词类型为单词类型枚举值FUZHI

strcpy(g_Words[g_nWordsIndex].szName,"=");

//识别出的单词放进单词队列g_Words中

g_Words[g_nWordsIndex].nLineNo=g_nLineNo;

g_nWordsIndex++;//识别出的单词个数加一

}

return OK;

}

其代码按照前面的“<=”修改,并在WORD_TYPE_ENUM中增加FUZHI、删掉InitializeSingleCharacterTable()函数中的EQL和在WordTypeToString()函数中增加case FUZHI: strcpy(strString,"FUZHI");break;

3.解决要求三:将原来无小数的数改为可以有小数的数。其主要代码如下: if(cACharacter=='.')

{ szAWord[nDigitNumber++]='.';

cACharacter=GetACharacterFromFile();

float j=0.1f;

do{

szAWord[nDigitNumber++]=cACharacter;

nNumberValue=nNumberValue+(cACharacter-'0')*j;

j=j*0.1;

cACharacter=GetACharacterFromFile();

}while(cACharacter>='0'&& cACharacter<='9' && cACharacter!=EOF); }

这段代码在源代码基础上加在do while 之后,主要是计算小数点后的值,j=j*0.1循环计算小数的值,szAWord[nDigitNumber++]='.'主要是将小数点加在整数后面,最后判断 cACharacter!=EOF是否为真或为假来结束循环。

4.解决要求四:增加识别字符常量和字符串常量的识别。其主要代码如下: if(cACharacter=='\'')

{

nDigitNumber=0;//数单词的字符个数

szAWord[nDigitNumber++]=cACharacter;

cACharacter=GetACharacterFromFile();//再取一个符号

if(cACharacter>='a'&&cACharacter<='z'||cACharacter>='0'&&cACharacter<='9' || cACharacter>='A' && cACharacter<='Z'){

szAWord[nDigitNumber++]=cACharacter;

cACharacter=GetACharacterFromFile();//再取一个符号

if(cACharacter=='\''){

szAWord[nDigitNumber++]=cACharacter;

cACharacter=GetACharacterFromFile();//再取一个符号,为下一步准备 szAWord[nDigitNumber]=0;//以0结尾在单词数组中组成一个数单词字符串

g_Words[g_nWordsIndex].eType=C_const;//单词类型为单词类型枚举值NUMBER

strcpy(g_Words[g_nWordsIndex].szName,szAWord);//识别出的单词放进单词队列g_Words中

g_Words[g_nWordsIndex].nLineNo=g_nLineNo;//在源代码文件中单

词所在的行数

g_nWordsIndex++;//识别出的单词个数加一

return OK;

}

}

}

else if(cACharacter=='\"'){

nDigitNumber=0;//数单词的字符个数< …… 此处隐藏:2446字,全部文档内容请下载后查看。喜欢就下载吧 ……

《编译原理》课程实验要求(词法分析).doc 将本文的Word文档下载到电脑

    精彩图片

    热门精选

    大家正在看

    × 游客快捷下载通道(下载后可以自由复制和排版)

    限时特价:7 元/份 原价:20元

    支付方式:

    开通VIP包月会员 特价:29元/月

    注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
    微信:fanwen365 QQ:370150219