主题:[讨论]一道编译原理实验题
词法分析器的设计
一、实验目的和要求
加深对状态转换图的实现及词法分析器的理解。熟悉词法分析器的主要算法及实现过程。要求学生掌握词法分析器的设计过程,并实现词法分析。
二、实验基本内容
给出一个简单语言的词法规则,画出状态转换图,并依据状态转换图编制出词法分析程序,词法规则如下:
单词符号 种别码 内码
BEGIN 1
DO 2
ELSE 3
END 4
IF 5
PROCEDURE 6
PROGRAM 7
THEN 8
VAR 9
WHILE 10
< 20
<= 21
> 22
>= 23
= 24
( 25
) 26
** 27
* 28
:= 29
+ 30
- 31
? 32
, 33
; 34
标识符 40
常数 50 二进制形式
三、问题描述及基本算法提示
1. 状态转换图的实现
让每个结点对应一小段程序。 需引进一组全局变量和过程
(1)ch 字符变量,存放最新读进的源程序字符。
(2)strToken 字符数组,存放构成单词符号的字符串。
(3)GetChar 子程序过程,将下一输入字符读到ch中,搜索指示器前移一字符位置。
(4)GetBC 子程序过程,检查ch中字符是否为空白。若是,则调用GetChar直至ch中进入一个非空白字符。
(5)Concat 子程序过程,将ch中的字符连接到strToken之后。例如, 假定strToken 原来的值为“AB”,而ch中存放着’C’,经调用Concat后,strToken的值就变为”ABC”。
(6)IsLetter和IsDigit 布尔函数过程,它们分别判断ch中的字符是否为字母和数字。
(7)Reserve 整型函数过程,对strToken中的字符找保留字表,若它是一个保留字,则返回它的编码,否则返回0值。
(8)Retract 子程序过程,将搜索指示器回调一个字符位置,将ch置为空白字符。
(9)InsertId 整型函数过程,将strToken中的标识符插入符号表,返回符号表指针。
(10)InsertConst 整型函数过程,将strToken中的常数插入常数表,返回常数表指针。
2.词法分析器构造基本算法
int code,value;
strToken:=“”; 置strToken为空串*/
GetChar();GetBC();
if (IsLetter())
begin
while (IsLetter() or IsDigit())
begin
Concat();GetChar();
end
Retract();
code : = Reserve();
if(code = 0)
begin
value : = InsertId(strToken);
return($ID,value);
end
else
return(code,-);
end
else if (IsDigit())
begin
while(IsDigit())
begin
Concat();GetChar();
end
Retract();
value : = InsertConst(strToken);
returnr($INT,value);
end
else if (ch = ‘ = ‘) retutn($ASSIGN,-);
else if (ch = ‘+’) return ($PLUS,-);
else if (ch =’*’)
begin
GetChar();
If (ch = ‘*’) return ($POWER,-);
Retract() ; return ($STAR,-);
end
else if (ch = ‘;’) return ($SEMICOLON,-);
else if (ch = ‘(‘) return ($LPAR,-);
else if (ch = ‘)’) return ($RPAR,-);
else if (ch = ‘{‘) return ($LBRACE,-);
else if (ch = ‘)’) rerurn ($RBRACE,);
else ProcError(); /错误处理/
一、实验目的和要求
加深对状态转换图的实现及词法分析器的理解。熟悉词法分析器的主要算法及实现过程。要求学生掌握词法分析器的设计过程,并实现词法分析。
二、实验基本内容
给出一个简单语言的词法规则,画出状态转换图,并依据状态转换图编制出词法分析程序,词法规则如下:
单词符号 种别码 内码
BEGIN 1
DO 2
ELSE 3
END 4
IF 5
PROCEDURE 6
PROGRAM 7
THEN 8
VAR 9
WHILE 10
< 20
<= 21
> 22
>= 23
= 24
( 25
) 26
** 27
* 28
:= 29
+ 30
- 31
? 32
, 33
; 34
标识符 40
常数 50 二进制形式
三、问题描述及基本算法提示
1. 状态转换图的实现
让每个结点对应一小段程序。 需引进一组全局变量和过程
(1)ch 字符变量,存放最新读进的源程序字符。
(2)strToken 字符数组,存放构成单词符号的字符串。
(3)GetChar 子程序过程,将下一输入字符读到ch中,搜索指示器前移一字符位置。
(4)GetBC 子程序过程,检查ch中字符是否为空白。若是,则调用GetChar直至ch中进入一个非空白字符。
(5)Concat 子程序过程,将ch中的字符连接到strToken之后。例如, 假定strToken 原来的值为“AB”,而ch中存放着’C’,经调用Concat后,strToken的值就变为”ABC”。
(6)IsLetter和IsDigit 布尔函数过程,它们分别判断ch中的字符是否为字母和数字。
(7)Reserve 整型函数过程,对strToken中的字符找保留字表,若它是一个保留字,则返回它的编码,否则返回0值。
(8)Retract 子程序过程,将搜索指示器回调一个字符位置,将ch置为空白字符。
(9)InsertId 整型函数过程,将strToken中的标识符插入符号表,返回符号表指针。
(10)InsertConst 整型函数过程,将strToken中的常数插入常数表,返回常数表指针。
2.词法分析器构造基本算法
int code,value;
strToken:=“”; 置strToken为空串*/
GetChar();GetBC();
if (IsLetter())
begin
while (IsLetter() or IsDigit())
begin
Concat();GetChar();
end
Retract();
code : = Reserve();
if(code = 0)
begin
value : = InsertId(strToken);
return($ID,value);
end
else
return(code,-);
end
else if (IsDigit())
begin
while(IsDigit())
begin
Concat();GetChar();
end
Retract();
value : = InsertConst(strToken);
returnr($INT,value);
end
else if (ch = ‘ = ‘) retutn($ASSIGN,-);
else if (ch = ‘+’) return ($PLUS,-);
else if (ch =’*’)
begin
GetChar();
If (ch = ‘*’) return ($POWER,-);
Retract() ; return ($STAR,-);
end
else if (ch = ‘;’) return ($SEMICOLON,-);
else if (ch = ‘(‘) return ($LPAR,-);
else if (ch = ‘)’) return ($RPAR,-);
else if (ch = ‘{‘) return ($LBRACE,-);
else if (ch = ‘)’) rerurn ($RBRACE,);
else ProcError(); /错误处理/