《编译原理》课程实验要求(词法分析)
时间:2025-04-20
时间: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字,全部文档内容请下载后查看。喜欢就下载吧 ……
上一篇:数字信号处理-z变换与离散时间傅立叶变换(DTFT)
下一篇:快乐工作_健康生活