资源描述
实验1-4 《编译原理》S语言词法分析程序设计方案
一、实验目
理解词法分析程序两种设计办法:1.依照状态转换图直接编程方式;2.运用DFA编写通用词法分析程序。
二、实验内容
1.依照状态转换图直接编程
编写一种词法分析程序,它从左到右逐个字符对源程序进行扫描,产生一种个单词二元式,形成二元式(记号)流文献输出。在此,词法分析程序作为单独一遍,如下图所示。
详细任务有:
(1)组织源程序输入
(2)拼出单词并查找其类别编号,形成二元式输出,得到单词流文献
(3)删除注释、空格和无用符号
(4)发现并定位词法错误,需要输出错误位置在源程序中第几行。将错误信息输出到屏幕上。
(5)对于普通标记符和常量,分别建立标记符表和常量表(使用线性表存储),当遇到一种标记符或常量时,查找标记符表或常量表,若存在,则返回位置,否则返回0并且填写符号表或常量表。
标记符表构造:变量名,类型(整型、实型、字符型),分派数据区地址
注:词法分析阶段只填写变量名,其他某些在语法分析、语义分析、代码生成等阶段逐渐填入。
常量表构造:常量名,常量值
2.编写DFA模仿程序
算法如下:
DFA(S=S0,MOVE[ ][ ],F[ ],ALPHABET[ ])
/*S为状态,初值为DFA初态,MOVE[ ][ ]为状态转换矩阵,F[ ] 为终态集,ALPHABET[ ] 为字母表,其中字母顺序与MOVE[ ][ ] 中列标题字母顺序一致。*/
{
Char Wordbuffer[10]=“”//单词缓冲区置空
Nextchar=getchar();//读
i=0;
while(nextchar!=NULL)//NULL代表此类单词
{ if (nextchar!∈ALPHABET[]) {ERROR(“非法字符”),return(“非法字符”);}
S=MOVE[S][nextchar] //下一状态
if(S=NULL)return(“不接受”);//下一状态为空,不能辨认,单词错误
wordbuffer[i]=nextchar ; //保存单词符号
i++;
nextchar=getchar();
}
Wordbuffer[i]=‘\0’;
If(S∈F)return(wordbuffer); //接受
Else return(“不接受”);
}
该算法规定:实现DFA算法,给定一种DFA(初态、状态转换矩阵、终态集、字母表),调用DFA(),辨认给定源程序中单词,查当作果与否对的。
三、实验规定
1.能对任何S语言源程序进行分析
在运营词法分析程序时,应当用问答形式输入要被分析S源语言程序文献名,然后对该程序完毕词法分析任务。
2.能检查并解决某些词法分析错误
词法分析程序能给出错误信息涉及:总出错个数,每个错误所在行号,错误编号及错误信息。
本实验规定解决如下两种错误(编号分别为1,2):
1:非法字符:单词表中不存在字符解决为非法字符,解决方式是删除该字符,给出错误信息,“某某字符非法”。
2:源程序文献结束而注释未结束。注释格式为:/* …… */
四、保存字和特殊符号表
单词代码
1
2
3
4
5
6
7
8
9
单词
int
char
float
void
const
for
if
else
then
单词助记符
int
char
float
void
const
for
if
else
then
内码值
-
-
-
-
-
-
-
-
-
单词代码
10
11
12
13
14
15
16
17
18
单词
while
switch
break
begin
end
标记符
数字(涉及整数和实数)
单词助记符
while
switch
break
begin
end
id
num
内码值
-
-
-
-
-
在符号表中位置
在常数表中位置
单词代码
19
20
21
22
23
24
25
26
27
单词
+
-
*
/
%
(
)
[
]
单词助记符
+
-
*
/
%
(
)
[
]
内码值
-
-
-
-
-
-
-
-
-
单词代码
28
30
35
36
单词
<
>
<=
>=
=
!=
%
;
单词助记符
rlop
%
;
内码值
<
>
<=
>=
=
!=
-
-
单词代码
37
38
39
40
41
42
43
44
45
单词
/=
+=
-=
*=
%=
||
&&
!
=
单词助记符
/=
+=
-=
*=
%=
or
and
not
=
内码值
-
-
-
-
-
-
-
-
-
单词构词规则:
字母=[A-Za-z]
数字=[0-9]
标记符=(字母|_)(字母|数字)*
数字=数字(数字)*(.数字+|e)
四、S语言表达式和语句阐明
1.算术表达式:+、-、*、/、%
2.关系运算符:>、>=、<、<=、==、!=
3.赋值运算符:=,+=、-=、*=、/=、%=
4.变量阐明:类型标记符 变量名表;
5.类型标记符:int char float
6.If语句:if 表达式then 语句 [else 语句]
7.For语句:for(表达式1;表达式2;表达式3) 语句
8.While语句:while 表达式 do 语句
9.S语言程序:由函数构成,函数不能嵌套定义。
函数格式为:
返回值 函数名(参数)
begin
数据阐明
语句
end
10.复合语句构成
begin
语句序列
end
五、程序参照构造阐明
1.Initscanner函数:程序初始化:输入并打开源程序文献和目的程序文献,初始化保存字表
2.Scanner函数:若文献未结束,重复调用lexscan函数辨认单词。
3.Lexscan函数:依照读入单词第一种字符拟定调用不同单词辨认函数
4.Isalpha函数:辨认保存字和标记符
5.Isnumber函数:辨认整数,如有精力,可加入辨认实数某些工功能
6.Isanotation函数:解决除号/和注释
7.Isother函数辨认其她特殊字符
8.Output函数:输出单词二元式到目的文献,输出格式(单词助记符,单词内码值),如(int,-)(rlop,>)……
9.Error函数:输出错误信息到屏幕
10.除此之外,还可以设立查符号表,填写符号表等函数,学生可自行设计。
六、实验过程阐明
1.每人单独完毕。
2.完毕后,由教师验收,并给出成绩。
3.实验完毕后,写出实验报告(规定交打印稿)。报告内容规定如下:
完毕人:班级、学号、姓名
一、实验名称:简化S语言词法分析器
二、实验目:通过手工编写简化C语言词法分析器,熟悉并进一步理解编译程序词法分析器工作原理。
三、实验内容:
1.依照保存字和特殊符号表能区别出源文献中保存字、普通标记符和特殊符号,并能进行简朴错误解决。
2.设计词法分析器模块调用构造图和各模块流程图。
3.程序源代码。
4.程序执行成果:输入文献,输出成果文献及屏幕信息。
四、实验中浮现问题及解决办法。
五、体会、意见或建议。
七、实验时间地点安排
共提供4次课上机时间,如上课不能完毕,课下自行解决
地点:1,2班 软2机房,3,4班软3机房
时间:
第三周 周一2单元
周三2单元
周五2单元
第四周 周一2单元
年3月
测试源程序示例:
//aa.c
void aa( )
begin
float rate,circle;
rate=3;
circle=3.14*rate*rate;
end
输出成果:
(1)输出成果文献:
(void,-)(id,0) ((,-) (),-) (begin,- ) ( float,-) (id,1)……
(2)标记符符号表:
Name type address
0
aa
1
rate
2
circle
3
4
5
(3)常数表:
Name value
0
3
1
3.14
2
3
展开阅读全文