湖北师范学院——计算机科学与技术学院 编译原理实验报告 0702 班
黄其华
编译原理实验报告
专
班
学
姓
业:
计算机科学与技术
级:
0702
号:
2007115010232
名:
黄 其 华
完成日期: 2010 年 6 月 6 日
1
湖北师范学院——计算机科学与技术学院 编译原理实验报告 0702 班
黄其华
实验一 词法分析
一、实验目的
掌握 Sample 语言的词法规则,熟悉 Sample 语言的词法分析过程,能够对 Sample 语言
的词法分析程序进行扩充。
二、实验内容
1. Sample 语言的单词符号
标识符:字母打头,后接字母数字,识别出的标识符用 ID 标记。
保留字(它是标识符的子集):
and|begin|bool|char|const|do|else|end|fasle|for|if|input|integer|not|or|output|program|read|repea
t|then|to|true|until|var|while|write,识别出的保留字直接用该保留字标记。
无符号整数:由数字组成,用 NUM 标记。
分界符:+、-、*、/、(、)、;、,>、<、{、}、!等单分界符,直接用单分界符标记。
>=、<=、!=、==等双字符分界符,直接用双分界符标记。
注释符:用/*….*/括起
为了从源程序字符流中正确识别出各类单词符号,相邻的标识符、整数或保留字之间至
少要用一个空格分开。Sample 语言的各类单词符号的正则文法规则如下:
∷=|ID|ID
∷=|NUM
∷= a|b|…|z|A|B|…|Z
∷=1|2|…|9|0
∷=+|-|*|/|=|(|)|{|}|:|,|;|<|>|!
∷=>=|<=|!=|==
∷=/*
∷=*/
三、词法分析的功能、目的
1 从左至右逐个字符地对源程序进行扫描,产生一个单词记号(token)。
2 按规则识别单词,输出单词本身及其类别码。这是词法分析的主要任务;
3 滤掉源程序中的无用成分,如注释、空格、回车等;
4 调用出错处理及符号管理程序。
四、词法分析程序设计说明
本实验是在老师所给的对 TEST 语言源程序进行词法分析的源语言的基础上完成的修改,
改成了对书上的 Sample 语言源程序进行词法分的程序,相应地也就主要改 TESTscan()函数
为 Samplescan()函数,改为对 sample 语言符号的处理。
1.源程序流程图如下:
开始
预定义 sample 语言中的
字符集和单词
①
2
湖北师范学院——计算机科学与技术学院 编译原理实验报告 0702 班
黄其华
①
打开源文件到 fin 中
能否打开
1
能否打开输出文件
1
读入一个字符到 ch 中
ch=EOF?
0
isdigit?
1
0
0
1
isalpha?
1
0
0
ch==’/’
双分界符处理和
其它处处理
1
继续读入一个到 ch
继续读入一个到 ch
继续读入一个到 ch
isalnum?
1
继续读入一个到 ch
输出“NUM”,token
0
ch==’*’
1
继续读入一个到 ch
注释处理
keyword?
单分界符处理
输出 ooken,token
输出“ID”,token
关闭文件
结束
3
湖北师范学院——计算机科学与技术学院 编译原理实验报告 0702 班
黄其华
(以上的流程图当中,对注释处理部分和单、双分界符处理及其它处理部分没有细化)
2.输入文件如下(sample.txt):
/*this is a sample programe writing in Sample languae*/
program example1;
/*used for illustrating compling process*/
var
a,b,c:integer;
x:char;
begin
if(a+c*c>b) and (b>3) then c:=3;
x:=2+(3*a)-b*c*8;
for x:=1+2 to 3 do b:=100;
while a>b do c:=5;
repeat a:=10;until a>b;
End.
3.实验结果为:
4.输出文件如下(result.txt):
program
program
a
,
b
,
c
:
char
begin
example1
;
ID
;
var var
ID
,
ID
,
ID
:
integer integer
;
;
x
ID
:
:
char
;
;
begin
if
(
ID
+
ID
if
(
a
+
c
4
*
c
>
b
)
*
ID
>
ID
)
and and
(
(
b
ID
>
>
NUM 3
)
)
then
c
ID
:=
:=
NUM 3
;
;
ID
x
:=
:=
NUM 2
+
+
(
(
NUM 3
*
*
a
ID
)
)
-
-
ID
b
*
*
ID
c
*
*
NUM 8
;
;
for for
ID
:=
NUM 1
+
+
NUM 2
to
NUM 3
do
ID
:=
NUM 100
do
b
:=
x
:=
to
湖北师范学院——计算机科学与技术学院 编译原理实验报告 0702 班
黄其华
then
5
湖北师范学院——计算机科学与技术学院 编译原理实验报告 0702 班
黄其华
while
repeat
;
;
while
a
ID
>
>
b
ID
do
do
ID
c
:=
:=
NUM 5
;
;
repeat
a
ID
:=
:=
NUM 10
;
;
until
ID
a
>
>
b
ID
;
;
end end
.
5.注意事项及实验体会
1) 实验中,注意:由于 Sample 语言中单分界符里有‘/’,而注释符开始也是‘/’,所以
为了防止程序碰到‘/’进入单分界符,需把对注释符的处理的程序段放在单分界符处
理程序之前。
until
.
2) 词法分析核心是充分掌握所分析源程序语言的词法规则和语法规则。
实验二 语法分析
一、实验目的
掌握 Sample 语言的语法规则,熟悉 Sample 语言的语法分析过程,能够对 Sample 语言
的语法分析程序进行扩充。
6
湖北师范学院——计算机科学与技术学院 编译原理实验报告 0702 班
黄其华
二、实验内容
1.Sample 语言程序的定义
(1)<程序>::=program<标识符>;<分程序>
(2)<分程序>::=<常量说明><变量说明><复合句>.
(3)<常量说明>::=const<常数定义>|
(4)<常数定义>::=标识符=<常数>;<常数定义>|标识符=<常数>
(5)<变量说明>::=var<变量定义>|
(6)<变量定义>::=<标识符表>:<类型>;|<标识符表>:<类型>;<变量定义>
(7)<标识符表>::=<标识符>,<标识符表>|<标识符>
(8)<复合句>::=begin<语句表>end.
(9)<语句表>::=<执行语句>;<语句表>|<执行语句>
(10)<执行语句> ::= <简单句>|<结构句>
(11)<简单句> ::= <赋值句>
(12)<赋值句> ::= <变量>:=<表达式>
(13)<变量> ::= <标识符>
(14)<结构语句> ::= <复合句>||||
(15) ::= if <布尔表达式> then <执行语句>
(16) ::= if <布尔表达式> then <执行语句> else <执行语句>
(17) ::= while <布尔表达式> do <执行语句>
(18) ::= for <标识符>:=<算术表达式> to <算术表达式>do <执行语句>
(19) ::= repeat <执行语句> until <布尔表达式>
三、语法分析的功能和目的
1 在词法分析识别出正确的单词符号串的基础上,根据语言定义的语法规则,从源程
序符号串中分析并识别出各种语法成分,同时进行语法检查和错误处理;
2 换一种说法就是要看是否能从文法的开始符号出发推导出这个输入串;或者从概念
上讲,就是能否建立一棵语法树;
3 可以粗略地把语法分析分成两类:自上而下分析法和自下而上分析法;这里是第一
种。
四、语法分析程序设计与说明
本实验是在老师所给的对 TEST 语言源程序进行语法分析的源语言的基础上完成的修改,
改成了对书上的 Sample 语言源程序进行词法分的程序,相应地也就主要改 TESTscan()函数
为 Samplescan()函数,TESTparse 函数改为 Sampleparse()函数,改为对 sample 语言符
号的语法处理。
由于 TEST 语言与 Sample 语言有很大不同,且整个工程还是算比较大,且语法造成要求
程序有许多嵌套,所以工作量太大,本人只是改动原程序对 Sample 语言中的 if 语句进行语
法分析,所以对其它语句的语法分析的处理还有待日后的改进。
1.输入文件如下(sample1.txt):
/*this is a sample programe writing in Sample languae*/
program example1;
/*used for illustrating compling process*/
var
a,b,c:integer;
x:char;
begin
7
湖北师范学院——计算机科学与技术学院 编译原理实验报告 0702 班
黄其华
if(a+c*c>b) and (b>3) then c:=3;
x:=2+(3*a)-b*c*8;
End.
2.实验结果为:
3.输出文件(huang.txt)为:
program
program
example1
;
ID
;
var var
ID
,
ID
,
ID
a
,
b
,
c
8