编译原理课程设计词法分析(有代码)

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

《编译原理》课程

实验报告

题目词法分析

专业计算机科学与技术

班级2013级计双班

学号2013708033

姓名刘畅

指导老师郑瑶

石河子大学信息学院计算机系

2014 年11 月20 日

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

二. 实验题目:词法分析

三. 实验日期: 2014年11月20日

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

操作系统:Windows

开发语言:C

五. 实验要求

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

可以跟大写字母或小写字母或数字或下划线”。

2)将<条件>中的表示相等关系的单词“=”改为“= =”;增加用于识别自增、

自减、关系运算符、逻辑运算符及逗号运算符的相关语句。

3)将原来无小数的数改为可以识别整数和小数的数。

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

5)或按C语言要求编写一个完整的用于识别C语言中各类单词的词法分析

程序。

六. 实验步骤

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

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

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

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

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

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

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

进行词法分析。

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

测试用例源程序:

const c1=5.61,c2=20,c3='S',c4="abc";

var num1,num2,count,sum1,sum2;

procedure func1;

var y1,y2;

begin

y1:=1;

y2:=x2

end;

begin

num1:=c1;

if num1>0&&num2!=5 then sum1=0;

if num1<=0||num2>0 then sum1=sum1+1;

count:=1;

while x1!=x2 do

x1++;

num2:=c2;

if num2==10 then

sum2=num2--;

else if num2>10 then

num2=num2-1;

else then

num2=num2+1;

call func1

End

运行结果截图:

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

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

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

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

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

do{

if(nAWordIndex

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;//单词类型为单词类型枚举值EQL

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

g_Words[g_nWordsIndex].nLineNo=g_nLineNo;//在源代码文件中单词所在的行数

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

cACharacter=GetACharacterFromFile();//再取一个符号,为下一步准备

return OK;

}

else

{//单词仅是'='

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

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

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

相关文档
最新文档