当前位置:文档之家› 词法分析器实验报告

词法分析器实验报告

词法分析器实验报告
词法分析器实验报告

0120810680104 学生学号实验课成绩

武汉理工大学

学生实验报告书

实验课程名称编译原理开课学院计算机科学与技术学院指导老师姓名饶文碧学生姓名李杰绪学生专业班级软件 0801班

2010 — 2011 学年第二学期

实验课程名称: 编译原理

实验项目名称单词的词法分析实验成绩

实验者李杰绪专业班级软件0801 组别

同组者实验日期 2011 年 4月第一部分:实验分析与设计(可加页)

一、实验内容描述(问题域描述)

完成对某一种常用高级语言(如Pascal、C语言、PL/0语言)的各类单词进行词法分析,即对源程序从左到右进行扫描,对组成源程序的字符串拼接成为单词;并把其转换成属性字输出。

二、实验基本原理与设计(包括实验方案设计,实验手段的确定,试验步骤等,用硬件逻辑或

者算法描述)

1.对给定的程序通过词法分析器弄够识别一个个单词符号,并以二元式(单词种别码,单词符号的属性值)显示。而本程序则是通过对给定路径的文件的分析后以单词符号和文字提示显示。

2.本程序自行规定:

(1)关键字"begin","end","if","then","else","while","write","read",

"do", "call","const","char","until","procedure","repeat"

(2)运算符:"+","-","*","/","="

(3)界符:"{","}","[","]",";",",",".","(",")",":"

(4)其他标记如字符串,表示以字母开头的标识符。

(5)空格、回车、换行符跳过。

3、显示:

输入:所给文法的源程序字符串。

输出:二元组(syn,token或sum)构成的序列。

其中:syn为单词种别码;

token为存放的单词自身字符串;

sum为整型常数。

4、程序源代码

#include

#include

#include

char prog[80],token[8];

char ch;

int syn,m,p=0,n,row,sum=0; char

*rwtab[6]={"begin","if","then","while","do","end"};

void scaner()

{

for(n=0;n<8;n++) token[n]=NULL;

ch=prog[p++];

while(ch==' ')

{

ch=prog[p];

p++;

}

if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))

{

m=0;

while((ch>='0'&&ch<='9')||(ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')) {

token[m++]=ch;

ch=prog[p++];

}

token[m++]='\0';

p--;

syn=10;

for(n=0;n<6;n++)

if(strcmp(token,rwtab[n])==0)

{

syn=n+1;

break;

}

}

else if((ch>='0'&&ch<='9'))

{

{

sum=0;

while((ch>='0'&&ch<='9')) {

sum=sum*10+ch-'0';

ch=prog[p++];

}

}

p--;

syn=11;

if(sum>32767)

syn=-1;

}

else switch(ch)

{

case'<':m=0;token[m++]=ch; ch=prog[p++];

if(ch=='>')

{

syn=21;

token[m++]=ch;

}

else if(ch=='=')

{

syn=22;

token[m++]=ch;

}

else

{

syn=23;

p--;

}

break;

case'>':m=0;token[m++]=ch; ch=prog[p++];

if(ch=='=')

{

syn=24;

token[m++]=ch;

}

else

{

syn=20;

p--;

}

break;

case':':m=0;token[m++]=ch; ch=prog[p++];

if(ch=='=')

{

syn=17;

token[m++]=ch;

}

else

{

syn=18;

p--;

}

break;

case'*':syn=13;token[0]=ch;break; case'/':syn=14;token[0]=ch;break; case'+':syn=15;token[0]=ch;break;

case'-':syn=16;token[0]=ch;break;

case'=':syn=25;token[0]=ch;break; case';':syn=26;token[0]=ch;break; case'(':syn=27;token[0]=ch;break; case')':syn=28;token[0]=ch;break; case'#':syn=0;token[0]=ch;break; case'\n':syn=-2;break;

default: syn=-1;break;

}

}

void main()

{

p=0;

row=1;

cout<<"Please input string:"<

do

{

cin.get(ch);

prog[p++]=ch;

}

while(ch!='#');

p=0;

do

{

scaner();

switch(syn)

{

case 11: cout<<"("<

default: cout<<"("<

}

while (syn!=0);

}

第二部分:实验调试与结果分析(可加页)

运行结果截图

1、给定源程序

begin x:=9; if x>0 then x:=2*x+1/3; end#

输出结果

2、源程序(包括上式未有的while、do以及判断错误语句): beginx<=$;

while

a<0

do

b<>9-x;

end

#

输出结果

begin

x<=$;

while

a<0

do

b<>9-x;

end

#

输出结果

三、主要仪器设备及耗材

Windows下的visual c++6.0

四、实验小结与体会

通过此次实验加深了我对编译原理中词法分析过程的认识,使我在C++编程方面得到了进

一步的练习,促进了我对理论联系操作的重要性的认识。

----------------下面是赠送的excel操作练习

不需要的下载后可以编辑删除

(Excel 2003部分)

1. 公式和函数

1. (1)打开当前试题目录下文件excel-10.xls;

,2,利用函数计算每个人各阶段总成绩~并利用函数计算各阶段的平均成

绩, ,3,“平均成绩”行数字格式都为带一位小数,例如0.0,格式, ,4,同名存盘。

步骤:

a) 文件?在各阶段总成绩单元格内~点插入~点函数~在对话框中选择求和函数“SUM”~在对话中Number1内点右侧的按钮~将出现另外一个对话框~在文件中选择需要求和的单元格~然后点该对话框的右侧按钮~点确定,完成一个总成绩求和后~利用填充柄完成其他的总成绩求和~或者重复上面的顺序,?在平均成绩单元格内~点插入~点函数~选择算术平均值函数AVERAGE~出现对话框后~采用求和时的相同方法~完成操作?选中平均成绩行~点右键点设臵单元格~点数字~在分类项下点数值~设小数位为1~ b) 确定?保存

2. (1)打开当前试题目录下文件excel-1

3.xls;

,2,根据工作表中给定数据~按“合计=交通费+住宿费+补助”公式计算“合计”数~并计算交通费、住宿费和补助的合计数,

,3,所有数字以单元格格式中货币类的“,”货币符号、小数点后2位数表现,如:,2,115.00格式,, ,4,同名存盘。

打开当前试题目录下文件excel-13.xls?在合计下的一个单元格内输入“=交通费,在该行的单元格~假如说是E3,+住宿费,同上,+补助,同上,”~回车,其他的合计可以采用填充柄完成~或者重复上面的顺序,?利用求和函数~参考1中的方法完成交通费、住宿费和补助的合计?选择文件中的所有数字单元格~点右键~点设臵单元格格式~点数字~点货币~

选择货币符号为“,”~设臵小数点后为2位~确定?保存文件?本题完成

3. (1)打开当前试题目录下文件excel-2.xls;

,2,根据工作表中数据~计算“总成绩”列的数据。总成绩=一阶段成绩×0.3+二阶段成绩×0.3+三阶段成绩×0.4,

,3,“总成绩”列数据格式为小数点后2位小数,例:6.20,,

,4,同名存盘。

打开当前试题目录下文件excel-2.xls?在总成绩下的一个单元格内输入“=一阶段成绩,在该行的单元格~假如说是E3,*0.3+住宿费,同上,*0.3+补助,同

上,*0.4”~回车,其他的合计可以采用填充柄完成~或者重复上面的顺序,?选中总成绩列的数据单元格~点右键~点设臵单元格格式~点数字~点数值~设臵小数点后为2位~确定?保存文件?本题完成

4. (1)打开当前试题目录下文件excel-3.xls;

,2,计算“审定费”和“税后款”~“审定费=全书字数?1000×3~税后款=审定费-审定费×5%”,

,3,利用菜单将“审定费”和“税后款”列格式设臵为货币类的“,”货币符号、小数点1位,例,1,280.0,, ,4,同名存盘。

打开当前试题目录下文件excel-3.xls?在审定费下的一个单元格内输入“=全书字数,在该行的单元格~假如说是E3,/1000*3”~回车,其他的审定费可以采用填充柄完成~或者重复上面的顺序,?在税后款下的一个单元格内输入“=审定费,在该行的单元格~假如说是F3,-审定费*5%”~回车,其他的税后款可以采用填充柄完成~或者重复上面的顺序,?选中审定费及税后款列的数据单元格~点右键~点设臵单元格格式~点货币~选择货币符号“,”~设臵小数点后为1位~确定?保存文件?本题完成

5. (1)打开当前试题目录下文件excel-8.xls;

,2,利用函数计算“总成绩”~利用公式“平均成绩=总成绩?3”来计算“平均成绩”, ,3,同名存盘。

打开当前试题目录下文件excel-8.xls?在总成绩下的一个单元格~点插入~点函数~在对话框中选求和函数“SUM”~在对话中Number1内点右侧的按钮~将出现另外一个对话框~在文件中选择需要求和的单元格~然后点该对话框的右侧按钮~点确定,完成一个总成绩求和后~利用填充柄完成其他的总成绩求和~或者重复

上面的顺序?在平均成绩下的一个单元格内~输入“=平均成绩,在该行的单元格~假如说是B3,/3”~回车,其他平均成绩可以采用填充柄完成~或者重复上面的顺序,?保存文件?本题完成

6. (1)打开当前试题目录下文件excel-1.xls;

,2,利用公式计算每个项目的“合计”,

,3,“合计”列数据的格式和其它数据的格式相同,

,4,同名存盘。

打开当前试题目录下文件excel-1.xls?在合计下的一个单元格~点插入~点函数~在对话框中选求和函数“SUM”~在对话中Number1内点右侧的按钮~将出现另外一个对话框~在文件中选择需要求和的单元格~然后点该对话框的右侧按钮~点确定,完成一个总成绩求和后~利用填充柄完成其他的总成绩求和~或者重复上面的顺序?利用格式刷将合计的列的数据格式刷成与其他数据格式相同的格式,使用格式刷的方法是~先选中合计列外的其他任意一个单元格~点格式刷~然后再点需要刷成该样格式的单元格即可,?保存文件?本题完成

7. (1)打开当前试题目录下文件excel-6.xls;

,2,计算出“净资产收益率”~净资产收益率=净利润?净资产总额,

,3,“净资产收益率”行以保留三位小数的百分数形式表现,如:32.310%,, ,4,同名存盘。

打开当前试题目录下文件excel-6.xls?在净资产收益率下的一个单元格~输入“=净利润,在该行的单元格~假如说是B3,/净资产总额”~回车,完成一个单元格后~可以利用填充柄完成其他的单元格的操作~或者重复上面的顺序,?选中净资产收益率列下的数据单元格~点右键~点设臵单元格格式~点数字~单百分比~将小数位数设为3位~确定?保存文件?本题完成

8. (1)打开当前试题目录下文件excel-7.xls;

,2,分别利用函数计算出“总成绩”、“平均成绩”,

,3,平均成绩设臵带两位小数格式,例如:78.00,,

,4,同名存盘。打开当前试题目录下的excel-7.xls文件?在总成绩对应的单元格内~点插入~点函数~在对话框中选择求和函数“SUM”~在对话中Number1内点右侧的按钮~将出现另外一个对话框~在文件中选择需要求和的单元格~然后点该对话框的右侧按钮~点确定,如果有多个总成绩项~完成一个总成绩求和后~利用填充柄完成其他的总成绩求和~或者重复上面的顺序,?在平均成绩对应的单元格内~点插入~点函数~选择算术平均值函数AVERAGE~出现对话框后~采用求和时的相同方法~完成操作?选中平均成绩对应的单元格~点右键~点设臵单元格~点数字~点数值~设小数位为2~确定?保存文件?本题完成

9. (1)打开当前试题目录下文件excel-16.xls;

,2,计算出“全套优惠价”~公式为:全套优惠价裸机价+入网费-送话费, ,3,所有数字都以单元格格式中货币类的“,”货币符号、小数点后1位小数表现,如:,1,450.00,, ,4,同名存盘。

打开当前试题目录下文件excel-16.xls?在全套优惠价对应的单元格~输入“=全套优惠价裸机价,在该行的单元格~假如说是B3,+入网费,同上,-送话费”~回车,如果有多个全套优惠价项~可以利用填充柄完成~也可以重复上面的顺序,?选中所有的数字单元格~点右键~点设臵单元格格式~点数字~点货币~选择货币符号为“,”~设小数位为2位~确定?保存文件?本题完成

10. (1)打开当前试题目录下文件excel-71.xls;

,2,利用函数计算奖金项的值~公式是“满工作量为40~满工作量的奖金为800元~工作量不足的奖金为600元”,

,3,利用公式计算实发工资项的值~公式是“实发工资为基本工资加奖金~再减去住房基金和保险费”,

,4,同名存盘。

打开当前试题目录下文件excel-71.xls?选中奖金项下的一个单元格~点插入

~点函数~点IF函数~在对话框中~第一个条件格式内输入“该行工作量项下的单元格,比如是E3,>=40,即E3>=40,”~在true内输入800~在false内输入600~确定,其余行可以采用填充柄完成~或重复上述的顺序,?选择实发工资项下的一个单元格~输入“=基本工资,在该行的单元格名,+奖金,同上,-住房基金,同上,-保险费,同上,”~确认,回车,,其余单元格采用填充柄完成~或重复上述顺序,?保存文件?本题完成

11. If函数的应用:根据教师工作表教师职称确定其职务津贴

练习Excel2003P140:Excel2003电子表格的编辑操作

2. 排序

3. (1)打开当前试题目录下文件excel-2

4.xls;

,2,在B4单元格内键入数字“45637”,

,3,表格所有数字格式为带1位小数格式,如:23456.0,, ,4,将Sheet1的所有

内容复制到工作表Sheet2的相应单元格内~并以“电器”为关键字~对四个季度所有数据递减排序,

,5,同名存盘。

打开当前试题目录下文件excel-24.xls?点B4单元格~输入“45637”?选中表格内的所有数字格式~点右键~点设臵单元格格式~点数字~设小数位为1~确定?全选SHEET1,即当前的文件,~点复制~点开SHEET2~点当前页面的左上角的单元格~点粘贴?点“电器”单元格~点表格~点排序~主要关键字下选择电器~点降序~确定?保存文件?本题完成

4. (1)打开当前试题目录下文件excel-29.xls;

,2,根据工作表中数据~在B4单元格内键入数据“2580”,

,3,表格数字数据设臵为“0,000.0”的格式, ,4,以“1997年”为关键字~对不同规格所有相应数据进行递减排序, ,5,同名存盘。

打开当前试题目录下文件excel-29.xls?点B4单元格~输入“2580”?选中表格内的所有数字格式~点右键~点设臵单元格格式~点数值~设小数位为1~点使用千分分隔符为有效~确定?点“1997年”单元格~点表格~点排序~主要关键字下选择1997~点降序~确定?保存文件?本题完成

5. (1)打开当前试题目录下文件excel-33.xls;

,2,根据工作表中数据~在E4单元格内键入数据“商务出版社”,

,3,将SHEET1所有内容复制到工作表SHEET2的相应位臵~并以“单价”为关键字~递减排序,

,4,同名存盘。

打开当前试题目录下文件excel-33.xls?点E4单元格~输入“商务出版社”?全选SHEET1,即当前的文件,~点复制~点开SHEET2~点当前页面的左上角的单元格~点粘贴?点“单价”单元格~点表格~点排序~主要关键字下选择单价~点降序~确定?保存文件?本题完成

6. (1)打开当前试题目录下文件excel-23.xls;

,2,根据工作表中数据~在A4单元格内键入数据“李四”,

,3,“总成绩”列数据都设臵为带一位小数格式,

,4,将所有内容复制到SHEET2工作表中相应单元格~并以“总成绩”为关键字递增排序, ,5,同名存盘。

打开当前试题目录下文件excel-23.xls?点A4单元格~输入“李四”?选中总成绩列的全部数据~点右键~点设臵单元格格式~点数字~点数值~设小数位为1位~确定?全选SHEET1,即当前的文件,~点复制~点开SHEET2~点当前页面的左上

角的单元格~点粘贴?点“总成绩”单元格~点表格~点排序~主要关键字下选择总成绩~点升序~确定?保存文件?本题完成

7. (1)打开当前试题目录下文件excel-36.xls;

,2,根据工作表中数据~在A4单元格内键入数据“狮子座”,

,3,A4单元格数据格式与该列其它相应数据格式保持一致,

,4,将SHEET1的所有内容复制到SHEET2中~并以“赤纬,度,”为关键字~递减排序, ,5,同名存盘。

打开当前试题目录下文件excel-36.xls?点A4单元格~输入“狮子座”?选中A4单元格所在列的其他单元格~点格式刷~点A4单元格?全选SHEET1,即当前的文件,~点复制~点开SHEET2~点当前页面的左上角的单元格~点粘贴?点“赤纬,度,”单元格~点表格~点排序~主要关键字下选择赤纬,度,~点降序~确定?保存文件?本题完成

8. (1)打开当前试题目录下文件excel-21.xls;

,2,根据工作表中数据~在B5单元格内键入数据2719840,

,3,B列、C列数字都以单元格格式中货币类的“,”货币符号、小数点后2位小数表现,如:,3,200,000.00”,,

,4,将所有内容拷贝到SHEET2中相应位臵~并按关键字“增长率”递减排

序, ,5,同名存盘。

打开当前试题目录下文件excel-21.xls?点B5单元格~输入“2719840”?选中B、C列下的数字,单元格,~点右键~点设臵单元格格式~点数字~点货币~设货币符号为“,”~设小数点位为2位~采用千分隔符~确定?全选SHEET1,即当前的文件,~点复制~点开SHEET2~点当前页面的左上角的单元格~点粘贴?点“增长率”单元格~点表格~点排序~主要关键字下选择增长率~点降序~确定?保存文件?本题完成

9. (1)打开当前试题目录下文件excel-30.xls;

,2,根据工作表中数据~在C4单元格内键入数据“3650”,

,3,所有数字所在格式为0,000.0格式,

,4,将SHEET1的所有内容复制到SHEET2相应单元格并以“木材”为关键字~递减排序, ,5,同名存盘。

打开当前试题目录下文件excel-30.xls?点C4单元格~输入“3650”?选中所有数字单元格~点右键~点设臵单元格格式~点数字~点数值~设小数位为1位~采用千分隔符~确定?全选SHEET1,即当前的文件,~点复制~点开SHEET2~点当前页面的左上角的单元格~点

粘贴?点“木材”单元格~点表格~点排序~主要关键字下选择增长率~点降序~确定?保存文件?本题完成

10. (1)打开当前试题目录下文件excel-27.xls;

,2,根据工作表中数据~在B3单元格内键入数据“1000×2000×15”, ,3,设臵报价列数据带1位小数格式,

,4,将所有内容复制到工作表SHEET2的相应位臵~并以“报价”为关键字~递减排序, ,5,同名存盘。

打开当前试题目录下文件excel-27.xls?点B3单元格~输入

“1000×2000×15”?选中报价列下的数字单元格~点右键~点设臵单元格格式~点数字~点数值~设小数位为1位~确定?全选SHEET1,即当前的文件,~点复制~点开SHEET2~点当前页面的左上角的单元格~点粘贴?点“报价”单元格~点表格~点排序~主要关键字下选择报价~点降序~确定?保存文件?本题完成

11. (1)打开当前试题目录下文件excel-22.xls;

,2,根据工作表中数据~在E8单元格内键入数据40115.7,

,3,“房价款,元,”列数字都以单元格格式中货币类的“,”货币符号、小数点后2位小数表现,如:,44,886.20,,

,4,将所有内容拷贝到SHEET2中的相应单元格内~并按关键字“房价款”递增排序, ,5,同名存盘。

打开当前试题目录下文件excel-22.xls?点E8单元格~输入“40115.7”?选中“房价,元,”列下的数字单元格~点右键~点设臵单元格格式~点数字~点货币~设货币符号为“,”~设小数位为2位~确定?全选SHEET1,即当前的文件,~点复制~点开SHEET2~点当前页面的左上角的单元格~点粘贴?点“房价款”单元格~点表格~点排序~主要关键字下选择房价款~点升序~确定?保存文件?本题完成

12. 图表

13. (1)打开当前试题目录下文件excel-47.xls;

,2,根据工作表中数据~建立折线图,

,3,生成图表的作用数据区域是A2:A6和E2:E6~数据系列产生在列~使用前一列为分类,X,轴坐标刻度标志~使用前一行作为图例说明,

,4,图表标题为“消费水平调查表”,

,5,生成新图表工作表,不是在原工作表中嵌入,~图表工作表的名称为“图表1”, ,6,同名存盘。

打开当前试题目录下文件excel-47.xls?点插入~点图表~在标准类型下~点折线图~选择一种折线图~点下一步~点数据区域右侧的按钮~出现另外一个对话框~在工作表中选择“A2:A6”数据区域~点对话框右侧的按钮~返回到数据区域对话框~选择系列产生在列~点下一步~点标题~图表标题内输入“消费水平调查表”~点下一步~选择“作为新工作表插入,即第一个选择,”~名称为“图表1”~确定?保存文件?本题完成

14. (1)打开当前试题目录下文件excel-56.xls;

,2,根据工作表中数据~建立数据点折线图,

,3,生成图表的作用数据区域是A2:E4~数据系列产生在“行”,

,4,图表标题为“净利润”~图例不显示~数据标志显示类别名称,

,5,生成新图表工作表存于原工作表中,

,6,同名存盘。

打开当前试题目录下文件excel-56.xls?点插入~点图表~在标准类型下~点折线图~选择数据点折线图~点下一步~点数据区域右侧的按钮~出现另外一个对话框~在工作表中选择“A2:E4”数据区域~点对话框右侧的按钮~返回到数据区域对话框~选择系列产生在行~点下一步~点标题~图表标题内输入“净利润”~点图例~选择显示图例~点数据标志~选择类别名称为有效~点下一步~选择“作为其中的对象插入,即第二个选择,”~名称为默认

的设臵~确定?保存文件?本题完成

15. (1)打开当前试题目录下文件excel-43.xls;

,2,根据工作表中数据~建立数据点折线图,

,3,生成图表的作用数据区域是A3:B7~数据系列产生在列~使用前一列为分类,X,轴坐标刻度线标志,使用前一行作为图例说明,

,4,图表标题为“销售额统计表”,

,5,生成新图表工作表,不是在原工作表中嵌入,~图表工作表的名称为“图表1”, ,6,同名存盘。

打开当前试题目录下文件excel-43.xls?点插入~点图表~在标准类型下~点折线图~选择数据点折线图~点下一步~点数据区域右侧的按钮~出现另外一个对话框~在工作表中选择“A3:B7”数据区域~点对话框右侧的按钮~返回到数据区域对话框~选择系列产生在列~点下一步~点标题~图表标题内输入“销售额统计

表”~点下一步~选择“作为新工作表插入,即第一个选择,”~名称为图表1~确定?保存文件?本题完成

16. (1)打开当前试题目录下文件excel-49.xls;

,2,根据工作表中数据~建立簇状柱形图,

,3,生成图表的作用数据区域是A2:A5和F2:F5~数据系列产生在列~使用前一列为分类,X,轴坐标刻度标志~使用前一行作为图例说明,

,4,图表标题为“总成绩图”,

,5,生成新图表工作表,不是在原工作表中嵌入,~图表工作表的名称为“图表1”, ,6,同名存盘。

打开当前试题目录下文件excel-49.xls?点插入~点图表~在标准类型下~点柱形图~选择簇状柱形图~点下一步~点数据区域右侧的按钮~出现另外一个对话框~在工作表中选择“A2:A5”数据区域~点对话框右侧的按钮~返回到数据区域对话框~选择系列产生在列~点下一步~点标题~图表标题内输入“总成绩图”~点下一步~选择“作为新工作表插入,即第一个选择,”~名称为图表1~确定?保存文件?本题完成

17. (1)打开当前试题目录下文件excel-41.xls;

,2,根据工作表中数据~建立簇状条形图,

,3,生成图表的作用数据区域是A2:C6~数据系列产生在列~使用前一列为分类,X,轴坐标刻度标志~使用前一行作为图例说明,

,4,图表标题为“家电销售情况图”,

,5,生成新图表工作表,不是在原工作表中嵌入,~图表工作表的名称为“图表1”, ,6,同名存盘。

打开当前试题目录下文件excel-41.xls?点插入~点图表~在标准类型下~点条形图~选择簇状条形图~点下一步~点数据区域右侧的按钮~出现另外一个对话

编译原理实验报告《LL(1)语法分析器构造》

《LL(1)分析器的构造》实验报告 一、实验名称 LL(1)分析器的构造 二、实验目的 设计、编制、调试一个LL(1)语法分析器,利用语法分析器对符号串的识别,加深对语法分析原理的理解。 三、实验内容和要求 设计并实现一个LL(1)语法分析器,实现对算术文法: G[E]:E->E+T|T T->T*F|F F->(E)|i 所定义的符号串进行识别,例如符号串i+i*i为文法所定义的句子,符号串ii+++*i+不是文法所定义的句子。 实验要求: 1、检测左递归,如果有则进行消除; 2、求解FIRST集和FOLLOW集; 3、构建LL(1)分析表; 4、构建LL分析程序,对于用户输入的句子,能够利用所构造的分析程序进行分析,并显示出分析过程。 四、主要仪器设备 硬件:微型计算机。 软件: Code blocks(也可以是其它集成开发环境)。 五、实验过程描述 1、程序主要框架 程序中编写了以下函数,各个函数实现的作用如下: void input_grammer(string *G);//输入文法G

//将文法G预处理得到产生式集合P,非终结符、终结符集合U、u, int eliminate_1(string *G,string *P,string U,string *GG);//消除文法G中所有直接左递归得到文法GG int* ifempty(string* P,string U,int k,int n);//判断各非终结符是否能推导为空 string* FIRST_X(string* P,string U,string u,int* empty,int k,int n);求所有非终结符的FIRST集 string FIRST(string U,string u,string* first,string s);//求符号串s=X1X2...Xn的FIRST集 string** create_table(string *P,string U,string u,int n,int t,int k,string* first);//构造分析表 void analyse(string **table,string U,string u,int t,string s);//分析符号串s 2、编写的源程序 #include #include #include using namespace std; void input_grammer(string *G)//输入文法G,n个非终结符 { int i=0;//计数 char ch='y'; while(ch=='y'){ cin>>G[i++]; cout<<"继续输入?(y/n)\n"; cin>>ch; } } void preprocess(string *G,string *P,string &U,string &u,int &n,int &t,int &k)//将文法G预处理产生式集合P,非终结符、终结符集合U、u, { int i,j,r,temp;//计数 char C;//记录规则中()后的符号 int flag;//检测到() n=t=k=0; for( i=0;i<50;i++) P[i]=" ";//字符串如果不初始化,在使用P[i][j]=a时将不能改变,可以用P[i].append(1,a) U=u=" ";//字符串如果不初始化,无法使用U[i]=a赋值,可以用U.append(1,a) for(n=0;!G[n].empty();n++) { U[n]=G[n][0]; }//非终结符集合,n为非终结符个数 for(i=0;i

实验一词法分析实验报告

实验一词法分析 一、实验目的 通过设计编制调试一个具体的词法分析程序,加深对词法分析原理的理解。并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。 编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。并依次输出各个单词的内部编码及单词符号自身值。(遇到错误时可显示“Error”,然后跳过错误部分继续显示) 二、实验要求 使用一符一种的分法 关键字、运算符和分界符可以每一个均为一种 标识符和常数仍然一类一种 三、实验内容 功能描述: 1、待分析的简单语言的词法 (1)关键字: begin if then while do end (2)运算符和界符: := + –* / < <= <> > >= = ; ( ) # (3)其他单词是标识符(ID)和整型常数(NUM),通过以下正规式定义: ID=letter(letter| digit)* NUM=digit digit * (4)空格由空白、制表符和换行符组成。空格一般用来分隔ID、NUM,运算符、界符和关键字,词法分析阶段通常被忽略。 2、各种单词符号对应的种别码 图 1

程序结构描述: 图 2 四、实验结果 输入begin x:=9: if x>9 then x:=2*x+1/3; end # 后经词法分析输出如下序列:(begin 1)(x 10)(:17)(= 18)(9 11)(;26)(if 2)……如图3所示:

图3 输入private x:=9;if x>0 then x:=2*x+1/3; end#后经词法分析输出如下序列:(private 10)(x 10)(:17)(= 18)(9 11)(;26)(if 2)……如图4所示: 图4 显然,private是关键字,却被识别成了标示符,这是因为图1中没有定义private关键字的种别码,所以把private当成了标示符。 输入private x:=9;if x>0 then x:=2*x+1/3; @ end#后经词法分析输出如下序列:(private 10)(x 10)(:17)(= 18)(9 11)(;26)(if 2)……如图5所示

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

编译技术 班级网络0802 学号3080610052姓名叶晨舟 指导老师朱玉全2011年 7 月 4 日

一、目的 编译技术是理论与实践并重的课程,而其实验课要综合运用一、二年级所学的多门课程的内容,用来完成一个小型编译程序。从而巩固和加强对词法分析、语法分析、语义分析、代码生成和报错处理等理论的认识和理解;培养学生对完整系统的独立分析和设计的能力,进一步培养学生的独立编程能力。 二、任务及要求 基本要求: 1.词法分析器产生下述小语言的单词序列 这个小语言的所有的单词符号,以及它们的种别编码和内部值如下表: 单词符号种别编码助记符内码值 DIM IF DO STOP END 标识符 常数(整)= + * ** , ( )1 2 3 4 5 6 7 8 9 10 11 12 13 14 $DIM $IF $DO $STOP $END $ID $INT $ASSIGN $PLUS $STAR $POWER $COMMA $LPAR $RPAR - - - - - - 内部字符串 标准二进形式 - - - - - - 对于这个小语言,有几点重要的限制: 首先,所有的关键字(如IF﹑WHILE等)都是“保留字”。所谓的保留字的意思是,用户不得使用它们作为自己定义的标示符。例如,下面的写法是绝对禁止的: IF(5)=x 其次,由于把关键字作为保留字,故可以把关键字作为一类特殊标示符来处理。也就是说,对于关键字不专设对应的转换图。但把它们(及其种别编码)预先安排在一张表格中(此表叫作保留字表)。当转换图识别出一个标识符时,就去查对这张表,确定它是否为一个关键字。 再次,如果关键字、标识符和常数之间没有确定的运算符或界符作间隔,则必须至少用一个空白符作间隔(此时,空白符不再是完全没有意义的了)。例如,一个条件语句应写为

实验一词法分析实验报告

实验一词法分析实验报告

实验一词法分析 一、实验目的 通过设计编制调试一个具体的词法分析程序,加深对词法分析原理的理解。并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。 编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。并依次输出各个单词的内部编码及单词符号自身值。(遇到错误时可显示“Error”,然后跳过错误部分继续显示) 二、实验要求 使用一符一种的分法 关键字、运算符和分界符可以每一个均为一种标识符和常数仍然一类一种 三、实验内容 功能描述: 1、待分析的简单语言的词法 (1)关键字:

begin if then while do end (2)运算符和界符: := + –* / < <= <> > > = = ; ( ) # (3)其他单词是标识符(ID)和整型常数(NUM),通过以下正规式定义: ID=letter(letter| digit)* NUM=digit digit * (4)空格由空白、制表符和换行符组成。空格一般用来分隔ID、NUM,运算符、界符和关键字,词法分析阶段通常被忽略。 2、各种单词符号对应的种别码 图 1

程序结构描述: 是 否 是 调用scanner() 字母 数 其他 运算符、 符号 界符等符号 否 是 图 2 四、实验结果 输入begin x:=9: if x>9 then x:=2*x+1/3; end # 后经词法分析输出如 变量忽略 是否输入返 拼数 syn=11返 对不同报拼字是否关syn 为对syn=10

编译原理实验报告(语法分析器)

. 编译原理实验专业:13级网络工程

语法分析器1 一、实现方法描述 所给文法为G【E】; E->TE’ E’->+TE’|空 T->FT’ T’->*FT’|空 F->i|(E) 递归子程序法: 首先计算出五个非终结符的first集合follow集,然后根据五个产生式定义了五个函数。定义字符数组vocabulary来存储输入的句子,字符指针ch指向vocabulary。从非终结符E函数出发,如果首字符属于E的first集,则依次进入T函数和E’函数,开始递归调用。在每个函数中,都要判断指针所指字符是否属于该非终结符的first集,属于则根据产生式进入下一个函数进行调用,若first集中有空字符,还要判断是否属于该非终结符的follow集。以分号作为结束符。 二、实现代码 头文件shiyan3.h #include #include

#include using namespace std; #define num 100 char vocabulary[num]; char *ch; void judge_E(); void judge_EE(); void judge_T(); void judge_TT(); void judge_F(); 源文件 #include"shiyan3.h" void judge_E() { if(*ch==';') { cout<<"该句子符合此文法!"<

int a=0; cout<<"按1结束程序"<>a; if(a==1) exit(0); } else if(*ch=='('||*ch=='i') { judge_T(); judge_EE(); } else { cout<<"该句子不匹配此文法!"<>a; if(a==1) exit(0); }

TEST语言 -语法分析,词法分析实验报告

编译原理实验报告 实验名称:分析调试语义分析程序 TEST抽象机模拟器完整程序 保证能用!!!!! 一、实验目的 通过分析调试TEST语言的语义分析和中间代码生成程序,加深对语法制导翻译思想的理解,掌握将语法分析所识别的语法范畴变换为中间代码的语义翻译方法。 二、实验设计 程序流程图

extern int TESTScan(FILE *fin,FILE *fout); FILE *fin,*fout; //用于指定输入输出文件的指针 int main() { char szFinName[300]; char szFoutName[300]; printf("请输入源程序文件名(包括路径):"); scanf("%s",szFinName); printf("请输入词法分析输出文件名(包括路径):"); scanf("%s",szFoutName); if( (fin = fopen(szFinName,"r")) == NULL) { printf("\n打开词法分析输入文件出错!\n"); return 0; } if( (fout = fopen(szFoutName,"w")) == NULL) { printf("\n创建词法分析输出文件出错!\n"); return 0; } int es = TESTScan(fin,fout); fclose(fin); fclose(fout); if(es > 0) printf("词法分析有错,编译停止!共有%d个错误!\n",es); else if(es == 0) { printf("词法分析成功!\n"); int es = 0;

词法分析器实验报告

词法分析器实验报告 词法分析器设计 一、实验目的: 对C语言的一个子集设计并实现一个简单的词法分析器,掌握利用状 态转换图设计词法分析器的基本方法。利用该词法分析器完成对源程 序字符串的词法分析。输出形式是源程序的单词符号二元式的代码, 并保存到文件中。 二、实验内容: 1. 设计原理 词法分析的任务:从左至右逐个字符地对源程序进行扫描,产生一个个单词符号。 理论基础:有限自动机、正规文法、正规式 词法分析器(Lexical Analyzer) 又称扫描器(Scanner):执行词法分析的程序 2. 词法分析器的功能和输出形式 功能:输入源程序、输出单词符号 程序语言的单词符号一般分为以下五种:关键字、标识符、常数、运算符,界符 3. 输出的单词符号的表示形式: 单词种别用整数编码,关键字一字一种,标识符统归为一种,常数一种,各种符号各一种。 4. 词法分析器的结构 单词符号 5. 状态转换图实现

三、程序设计 1.总体模块设计 /*用来存储目标文件名*/ string file_name; /*提取文本文件中的信息。*/ string GetText(); /*获得一个单词符号,从位置i开始查找。并且有一个引用参数j,用来返回这个单词最后一个字符在str的位置。*/ string GetWord(string str,int i,int& j); /*这个函数用来除去字符串中连续的空格和换行 int DeleteNull(string str,int i); /*判断i当前所指的字符是否为一个分界符,是的话返回真,反之假*/ bool IsBoundary(string str,int i); /*判断i当前所指的字符是否为一个运算符,是的话返回真,反之假*/ bool IsOperation(string str,int i);

词法分析器实验报告

词法分析器实验报告 词法分析器实验报告实验目的: 设计、编制、调试一个词法分析子程序,识别单词,加深对词法分析原理的理 解。 实验要求: 该程序要实现的是一个读单词过程,从输入的源程序中,识别出各个具有独立 意义的单词,即基本保留字、标识符、常数、运算符、分界符五大类。并依次输出 各个单词的内部编码及单词符号自身值。 (一)实验内容 (1)功能描述:对给定的程序通过词法分析器弄够识别一个个单词符号,并以二 元式(单词种别码,单词符号的属性值)显示。而本程序则是通过对给定路径的文件 的分析后以单词符号和文字提示显示。 (2)程序结构描述: 函数调用格式: 函数调用格式函数名(实在参数表 ) Switch(m)、 isKey(String string)、isLetter(char c)、实参 isDigit(char c)、isOperator(char c) isKey(String string)、isLetter(char c)、调作为表达式 isDigit(char c)、isOperator(char c) 用 方 作为语句 getChar()、judgement()、 法 函数的递归调用 isOperator(char c) 、isLetter(char c)、isDigit(char c)

参数含义: 1 String string;存放读入的字符串 String str; 存放暂时读入的字符串 char ch; 存放读入的字符 int rs 判断读入的文件是否为空 char []data 存放文件中的数据 int m;通过switch用来判断字符类型, 函数之间的调用关系图: main Complier..judgement isOperate() M=0 getChar( ) isDigit() M=4 For(ch ) isLet ter() M=2 Switch(m) isKey() M=3 函数功能: Judgement()判断输入的字符并输出单词符号,返回值为空; getChar() 读取文件的,返回值为空; isLetter(char c) 判断读入的字符是否为字母的,返回值为Boolean类型; switch (m) 判断跳转输出返回值为空; isOperator(char c)判断是否为运算符的,返回值为Boolean类型; isKey(String string)判断是否为关键字的,返回值为Boolean类型; isDigit(char c) 判断读入的字符是否为数字的,返回值为Boolean类型。测试结果:

编译原理LL(1)语法分析实验报告

学号20102798 专业软件工程姓名薛建东 实验日期2013.04.08 教师签字成绩实验报告 【实验名称】LL(1)语法分析 【实验目的】 通过完成预测分析法的语法分析程序,了解预测分析法和递归子程序法的区别和联系。使了解语法分析的功能,掌握语法分析程序设计的原理和构造方法,训练掌握开发应用程序的基本方法。 【实验内容】 ◆根据某一文法编制调试LL ( 1)分析程序,以便对任意输入的符号串进行分析。 ◆构造预测分析表,并利用分析表和一个栈来实现对上述程序设计语言的分析程序。 ◆分析法的功能是利用LL(1)控制程序根据显示栈栈顶内容、向前看符号以及LL(1) 分析表,对输入符号串自上而下的分析过程。 【设计思想】 (1)、LL(1)文法的定义 LL(1)分析法属于确定的自顶向下分析方法。LL(1)的含义是:第一个L表明自顶向下分析是从左向右扫描输入串,第2个L表明分析过程中将使用最左推导,1表明只需向右看一个符号便可决定如何推导,即选择哪个产生式(规则)进行推导。 LL(1)文法的判别需要依次计算FIRST集、FOLLOW集和SELLECT集,然后判断是否为LL(1)文法,最后再进行句子分析。 需要预测分析器对所给句型进行识别。即在LL(1)分析法中,每当在符号栈的栈顶出现非终极符时,要预测用哪个产生式的右部去替换该非终极符;当出现终结符时,判断其与剩余输入串的第一个字符是否匹配,如果匹配,则继续分析,否则报错。LL(1)分析方法要求文法满足如下条件:对于任一非终极符A的两个不同产生式A→α,A→β,都要满足下面条件:SELECT(A→α)∩SELECT(A→β)=? (2)、预测分析表构造 LL(1)分析表的作用是对当前非终极符和输入符号确定应该选择用哪个产生式进行推

东南大学编译原理词法分析器实验报告

词法分析设计 1. 实验目的 通过本实验的编程实践,了解词法分析的任务,掌握词法分析程序设计的原理和构造方法,对编译的基本概念、原理和方法有完整的和清楚的理解,并能正确地、熟练地运用。 2. 实验内容 用C++语言实现对C++语言子集的源程序进行词法分析。通过输入源程序从左到右对字符串进行扫描和分解,依次输出各个单词的内部编码及单词符号自身值;若遇到错误则显示“Error”,然后跳过错误部分继续显示;同时进行标识符登记符号表的管理。 3. 实验原理 本次实验采用NFA->DFA->DFA0的过程: 对待分析的简单的词法(关键词/id/num/运算符/空白符等)先分别建立自己的FA,然后将他们用产生式连接起来并设置一个唯一的开始符,终结符不合并。 待分析的简单的词法 (1)关键字: "asm","auto","bool","break","case","catch","char","class","

const","const_cast"等 (2)界符(查表) ";",",","(",")","[","]","{","}" (3)运算符 "*","/","%","+","-","<<","=",">>","&","^","|","++","--"," +=","-=","*=","/=","%=","&=","^=","|=" relop: (4)其他单词是标识符(ID)和整型常数(SUM),通过正规式定义。 id/keywords: digit: (5)空格有空白、制表符和换行符组成。空格一般用来分隔ID、SUM、运算符、界符和关键字,词法分析阶段通常被忽略。

词法分析器实验报告

词法分析器实验报告 一、实验目的及要求 本次实验通过用C语言设计、编制、调试一个词法分析子程序,识别单词,实现一个C语言词法分析器,经过此过程可以加深对编译器解析单词流的过程的了解。 运行环境: 硬件:windows xp 软件:visual c++6.0 二、实验步骤 1.查询资料,了解词法分析器的工作过程与原理。 2.分析题目,整理出基本设计思路。 3.实践编码,将设计思想转换用c语言编码实现,编译运行。 4.测试功能,多次设置包含不同字符,关键字的待解析文件,仔细察看运行结果,检测该分析器的分析结果是否正确。通过最终的测试发现问题,逐渐完善代码中设置的分析对象与关键字表,拓宽分析范围提高分析能力。 三、实验内容 本实验中将c语言单词符号分成了四类:关键字key(特别的将main说明为主函数)、普通标示符、常数和界符。将关键字初始化在一个字符型指针数组*key[]中,将界符分别由程序中的case列出。在词法分析过程中,关键字表和case列出的界符的内容是固定不变的(由程序中的初始化确定),因此,从源文件字符串中识别出现的关键字,界符只能从其中选取。标识符、常数是在分析过程中不断形成的。 对于一个具体源程序而言,在扫描字符串时识别出一个单词,若这个单词的类型是关键字、普通标示符、常数或界符中之一,那么就将此单词以文字说明的形式输出.每次调用词法分析程序,它均能自动继续扫描下去,形成下一个单词,直到整个源程序全部扫描完毕,从而形成相应的单词串。 输出形式例如:void $关键字

流程图、程序流程图:

程序: #include #include #include #include //定义关键字 char *Key[10]={"main","void","int","char","printf","scanf","else","if","return"}; char Word[20],ch; // 存储识别出的单词流 int IsAlpha(char c) { //判断是否为字母 if(((c<='z')&&(c>='a'))||((c<='Z')&&(c>='A'))) return 1; else return 0; } int IsNum(char c){ //判断是否为数字 if(c>='0'&&c<='9') return 1; else return 0; } int IsKey(char *Word){ //识别关键字函数 int m,i; for(i=0;i<9;i++){ if((m=strcmp(Word,Key[i]))==0) { if(i==0) return 2; return 1; } } return 0; } void scanner(FILE *fp){ //扫描函数 char Word[20]={'\0'}; char ch; int i,c; ch=fgetc(fp); //获取字符,指针fp并自动指向下一个字符 if(IsAlpha(ch)){ //判断该字符是否是字母 Word[0]=ch; ch=fgetc(fp);

语法分析(自上而下分析)实验报告

实习二语法分析-自上而下分析 一、实验目的 使用预测分析方法对输入的表达式进行分析,掌握其具体的使用并且学会去分析一个文法。 二、实验内容 1.设计表达式的语法分析器算法(使用预测分析) 2.编写一段代码并上机调试查看其运行结果 三、实验要求 使用LL(1)分析算法设计表达式的语法分析器 LL(1)文法是一个自上而下的语法分析方法,它是从文法的开始符号出发,生成句子的最左推导,从左到右扫描源程序,每次向前查看一个字符,确定当前应该选择的产生式。 实现LL(1)分析的另一种有效方法是使用一张分析表和一个栈进行联合控制。 预测分析程序的总控程序在任何时候都是按STACK栈顶符号X和当前a的输入符号行事的。对于任何(X,a),总控程序每次都执行三种可能的动作之一。 1.若X=a=“#”,则宣布分析成功,停止分析过程 2.若X=a≠“#”,则把X从STACK栈顶逐出,让a指向下一 个输入符号。 3.若X是一个非终结符,则查看分析表。 四、运行结果

(本程序只能对由'i','+','*','(',')'构成的以'#'结束的字符串进行分析) 五、源程序实现 /*LL(1)分析法源程序,只能在VC++中运行*/ #include #include #include #include char A[20]; char B[20]; char v1[20]={'i','+','*','(',')','#'};/*终结符*/ char v2[20]={'E','G','T','S','F'};/*非终结符*/ int j=0,b=0,top=0,l;/*L为输入串长度*/

词法分析的实验报告

《词法分析》实验报告

目录 目录错误!未定义书签。 1 实验目的错误!未定义书签。 2 实验内容错误!未定义书签。 TINY计算机语言描述错误!未定义书签。 实验要求错误!未定义书签。 3 此法分析器的程序实现错误!未定义书签。状态转换图错误!未定义书签。 程序源码错误!未定义书签。 实验运行效果截图错误!未定义书签。 4 实验体会错误!未定义书签。

实验目的 1、学会针对DFA转换图实现相应的高级语言源程序。 2、深刻领会状态转换图的含义,逐步理解有限自动机。 3、掌握手工生成词法分析器的方法,了解词法分析器的内部工作原理。 实验内容 TINY计算机语言描述 TINY计算机语言的编译程序的词法分析部分实现。 从左到右扫描每行该语言源程序的符号,拼成单词,换成统一的内部表示(token)送给语法分析程序。 为了简化程序的编写,有具体的要求如下: 1、数仅仅是整数。 2、空白符仅仅是空格、回车符、制表符。 3、代码是自由格式。 4、注释应放在花括号之内,并且不允许嵌套 TINY语言的单词 要求实现编译器的以下功能 1、按规则拼单词,并转换成二元式形式 2、删除注释行 3、删除空白符(空格、回车符、制表符) 4、列表打印源程序,按照源程序的行打印,在每行的前面加上行号,并且打印出每行包含的记号的二元形式 5、发现并定位错误 词法分析进行具体的要求 1、记号的二元式形式中种类采用枚举方法定义;其中保留字和特殊字符是每个都一个种类,标示符自己是一类,数字是一类;单词的属性就是表示的字符串值。 2、词法分析的具体功能实现是一个函数GetToken(),每次调用都对剩余的字符串分析得到一个单词或记号识别其种类,收集该记号的符号串属性,当识别一个单词完毕,采用返回值的形式返回符号的种类,同时采用程序变量的形式提供当前识别出记号的属性值。这样配合语法分析程序的分析需要的记号及其属性,生成一个语法树。

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

编译原理语法分析器实验报告 班级: 学号: 姓名:

实验名称语法分析器 一、实验目的 1、根据某一文法编制调试LL(1)分析程序,以便对任意输入的符号串进行分析。 2、本次实验的目的主要是加深对自上而下分析法的理解。 二、实验内容 [问题描述] 递归下降分析法: 0.定义部分:定义常量、变量、数据结构。 1.初始化:从文件将输入符号串输入到字符缓冲区中。 2.利用递归下降分析法分析,对每个非终结符编写函数,在主函数中调用文法开始符号的函数。 LL(1)分析法: 模块结构: 1、定义部分:定义常量、变量、数据结构。 2、初始化:设立LL(1)分析表、初始化变量空间(包括堆栈、结构体等); 3、运行程序:让程序分析一个text文件,判断输入的字符串是否符合文法定义的规则; 4、利用LL(1)分析算法进行表达式处理:根据LL(1)分析表对表达式 符号串进行堆栈(或其他)操作,输出分析结果,如果遇到错误则显示简 单的错误提示。 [基本要求] 1. 对数据输入读取 2. 格式化输出分析结果 2.简单的程序实现词法分析 public static void main(String args[]) { LL l = new LL(); l.setP(); String input = ""; boolean flag = true;

while (flag) { try { InputStreamReader isr = new InputStreamReader(System.in); BufferedReader br = new BufferedReader(isr); System.out.println(); System.out.print("请输入字符串(输入exit退出):"); input = br.readLine(); } catch (Exception e) { e.printStackTrace(); } if(input.equals("exit")){ flag = false; }else{ l.setInputString(input); l.setCount(1, 1, 0, 0); l.setFenxi(); System.out.println(); System.out.println("分析过程"); System.out.println("----------------------------------------------------------------------"); System.out.println(" 步骤| 分析栈 | 剩余输入串| 所用产生式"); System.out.println("----------------------------------------------------------------------"); boolean b = l.judge(); System.out.println("----------------------------------------------------------------------"); if(b){ System.out.println("您输入的字符串"+input+"是该文法的一个句子"); }else{ System.out.println("您输入的字符串"+input+"有词法错误!");

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

(此文档为word格式,下载后您可任意编辑修改!) 编译技术 班级网络0802 学号 姓名叶晨舟 指导老师朱玉全 2011年 7 月 4 日

一、目的 编译技术是理论与实践并重的课程,而其实验课要综合运用一、二年级所学的多门课程的内容,用来完成一个小型编译程序。从而巩固和加强对词法分析、语法分析、语义分析、代码生成和报错处理等理论的认识和理解;培养学生对完整系统的独立分析和设计的能力,进一步培养学生的独立编程能力。 二、任务及要求 基本要求: 1.词法分析器产生下述小语言的单词序列 这个小语言的所有的单词符号,以及它们的种别编码和内部值如下表: 单词符号种别编码助记符内码值 DIM IF DO STOP END 标识符 常数(整)= + * ** , ( )1 2 3 4 5 6 7 8 9 10 11 12 13 14 $DIM $IF $DO $STOP $END $ID $INT $ASSIGN $PLUS $STAR $POWER $COMMA $LPAR $RPAR - - - - - - 内部字符串 标准二进形式 - - - - - - 对于这个小语言,有几点重要的限制: 首先,所有的关键字(如IF﹑WHILE等)都是“保留字”。所谓的保留字的意思是,用户不得使用它们作为自己定义的标示符。例如,下面的写法是绝对禁止的: IF(5)=x 其次,由于把关键字作为保留字,故可以把关键字作为一类特殊标示符来处理。也就是说,对于关键字不专设对应的转换图。但把它们(及其种别编码)预先安排在一张表格中(此表叫作保留字表)。当转换图识别出一个标识符时,就去查对这张表,确定它是否为一个关键字。 再次,如果关键字、标识符和常数之间没有确定的运算符或界符作间隔,则必须至少用一个空白符作间隔(此时,空白符不再是完全没有意义的了)。例如,一个条件语句应写为 IF i>0 i= 1;

词法分析实验报告

编译原理实验一 姓名:朱彦荣 学号: 专业:软件工程2 实验题目:词法分析 完成语言:C/C++ 上级系统:VC++6.0 日期:2015/11/7 词法分析 设计题目:手工设计c语言的词法分析器 (可以是c语言的子集) 设计内容: 处理c语言源程序,过滤掉无用符号,判断源程序中单词的合法性,并分解出正确的单词,以二元组形式存放在文件中。 设计目的: 了解高级语言单词的分类,了解状态图以及如何表示并识别单词规则,掌握状态图到识别程序的编程。 结果要求:课程设计报告。 完成日期:第十五周提交报告 一.分析 要想手工设计词法分析器,实现C语言子集的识别,就要明白什么是词法

主要是对源程序进行编译预处理(去除注释、无用的回车换行找到包含的文件等)之后,对整个源程序进行分解,分解成一个个单词,这些单词有且只有五类,分别是标识符、保留字、常数、运算符、界符。以便为下面的语法分析和语义分析做准备。可以说词法分析面向的对象是单个的字符,目的是把它们组成有效的单词(字符串);而语法的分析则是利用词法分析的结果作为输入来分析是否符合语法规则并且进行语法制导下的语义分析,最后产生四元组(中间代码),进行优化(可有可无)之后最终生成目标代码。可见词法分析是所有后续工作的基础,如果这一步出错,比如明明是‘<=’却被拆分成‘<’和‘=’就会对下文造成不可挽回的影响。因此,在进行词法分析的时候一定要定义好这五种符号的集合。下面是我构造的一个C语言子集。 第一类:标识符letter(letter | digit)* 无穷集 第二类:常数(digit)+ 无穷集 第三类:保留字(32) auto break case char const continue default do double else enum extern float for goto if int long register return short signed sizeof static struct switch typedef union unsigned void volatile while 第四类:界符‘/*’、‘//’、() { } [ ] " " ' 等 第五类:运算符<、<=、>、>=、=、+、-、*、/、^、等 对所有可数符号进行编码: <$,0> ... <+,33> <-,34> <*,35> <<,37> <<=,38> <>,39> <>=,40>

语法分析器实验报告

语法分析器的设计实验报告 一、实验内容 语法分析程序用LL(1)语法分析方法。首先输入定义好的文法书写文件(所用的文法可以用LL(1)分析),先求出所输入的文法的每个非终结符是否能推出空,再分别计算非终结符号的FIRST集合,每个非终结符号的FOLLOW集合,以及每个规则的SELECT集合,并判断任意一个非终结符号的任意两个规则的SELECT 集的交集是不是都为空,如果是,则输入文法符合LL(1)文法,可以进行分析。对于文法: G[E]: E->E+T|T T->T*F|F F->i|(E) 分析句子i+i*i是否符合文法。 二、基本思想 1、语法分析器实现 语法分析是编译过程的核心部分,它的主要任务是按照程序的语法规则,从由词法分析输出的源程序符号串中识别出各类语法成分,同时进行词法检查,为语义分析和代码生成作准备。这里采用自顶向下的LL(1)分析方法。 语法分析程序的流程图如图5-4所示。 语法分析程序流程图 该程序可分为如下几步: (1)读入文法 (2)判断正误 (3)若无误,判断是否为LL(1)文法 (4)若是,构造分析表; (5)由句型判别算法判断输入符号串是为该文法的句型。 三、核心思想 该分析程序有15部分组成: (1)首先定义各种需要用到的常量和变量;

(2)判断一个字符是否在指定字符串中; (3)读入一个文法; (4)将单个符号或符号串并入另一符号串; (5)求所有能直接推出&的符号; (6)求某一符号能否推出‘& ’; (7)判断读入的文法是否正确; (8)求单个符号的FIRST; (9)求各产生式右部的FIRST; (10)求各产生式左部的FOLLOW; (11)判断读入文法是否为一个LL(1)文法; (12)构造分析表M; (13)句型判别算法; (14)一个用户调用函数; (15)主函数; 下面是其中几部分程序段的算法思想: 1、求能推出空的非终结符集 Ⅰ、实例中求直接推出空的empty集的算法描述如下: void emp(char c){ 参数c为空符号 char temp[10];定义临时数组 int i; for(i=0;i<=count-1;i++)从文法的第一个产生式开始查找 { if 产生式右部第一个符号是空符号并且右部长度为1, then将该条产生式左部符号保存在临时数组temp中 将临时数组中的元素合并到记录可推出&符号的数组empty中。 } Ⅱ、求某一符号能否推出'&' int _emp(char c) { //若能推出&,返回1;否则,返回0 int i,j,k,result=1,mark=0; char temp[20]; temp[0]=c; temp[1]='\0'; 存放到一个临时数组empt里,标识此字符已查找其是否可推出空字 如果c在可直接推出空字的empty[]中,返回1 for(i=0;;i++) { if(i==count) return(0); 找一个左部为c的产生式 j=strlen(right[i]); //j为c所在产生式右部的长度 if 右部长度为1且右部第一个字符在empty[]中. then返回1(A->B,B可推出空) if 右部长度为1但第一个字符为终结符,then 返回0(A->a,a为终结符) else

语法分析器实验报告

语法分析器的设计实验报告 一、实验容 语法分析程序用LL(1)语法分析方法。首先输入定义好的文法书写文件(所用的文法可以用LL(1)分析),先求出所输入的文法的每个非终结符是否能推出空,再分别计算非终结符号的FIRST集合,每个非终结符号的FOLLOW集合,以及每个规则的SELECT集合,并判断任意一个非终结符号的任意两个规则的SELECT 集的交集是不是都为空,如果是,则输入文法符合LL(1)文法,可以进行分析。对于文法: G[E]: E->E+T|T T->T*F|F F->i|(E) 分析句子i+i*i是否符合文法。 二、基本思想 1、语法分析器实现 语法分析是编译过程的核心部分,它的主要任务是按照程序的语法规则,从由词法分析输出的源程序符号串中识别出各类语法成分,同时进行词法检查,为语义分析和代码生成作准备。这里采用自顶向下的LL(1)分析方法。 语法分析程序的流程图如图5-4所示。 语法分析程序流程图 该程序可分为如下几步: (1)读入文法 (2)判断正误 (3)若无误,判断是否为LL(1)文法 (4)若是,构造分析表; (5)由句型判别算法判断输入符号串是为该文法的句型。 三、核心思想 该分析程序有15部分组成: (1)首先定义各种需要用到的常量和变量;

(2)判断一个字符是否在指定字符串中; (3)读入一个文法; (4)将单个符号或符号串并入另一符号串; (5)求所有能直接推出&的符号; (6)求某一符号能否推出‘& ’; (7)判断读入的文法是否正确; (8)求单个符号的FIRST; (9)求各产生式右部的FIRST; (10)求各产生式左部的FOLLOW; (11)判断读入文法是否为一个LL(1)文法; (12)构造分析表M; (13)句型判别算法; (14)一个用户调用函数; (15)主函数; 下面是其中几部分程序段的算法思想: 1、求能推出空的非终结符集 Ⅰ、实例中求直接推出空的empty集的算法描述如下: void emp(char c){ 参数c为空符号 char temp[10];定义临时数组 int i; for(i=0;i<=count-1;i++)从文法的第一个产生式开始查找 { if 产生式右部第一个符号是空符号并且右部长度为1, then将该条产生式左部符号保存在临时数组temp中 将临时数组中的元素合并到记录可推出&符号的数组empty中。 } Ⅱ、求某一符号能否推出'&' int _emp(char c) { //若能推出&,返回1;否则,返回0 int i,j,k,result=1,mark=0; char temp[20]; temp[0]=c; temp[1]='\0'; 存放到一个临时数组empt里,标识此字符已查找其是否可推出空字 如果c在可直接推出空字的empty[]中,返回1 for(i=0;;i++) { if(i==count) return(0); 找一个左部为c的产生式 j=strlen(right[i]); //j为c所在产生式右部的长度 if 右部长度为1且右部第一个字符在empty[]中. then返回1(A->B,B可推出空) if 右部长度为1但第一个字符为终结符,then 返回0(A->a,a为终结符) else

相关主题
文本预览
相关文档 最新文档