词法分析器的设计
一、实验目的和要求
加深对状态转换图的实现及词法分析器的理解。熟悉词法分析器的主要算法及实现过程。要求学生掌握词法分析器的设计过程,并实现词法分析。
二、实验基本内容
给出一个简单语言的词法规则,画出状态转换图,并依据状态转换图编制出词法分析程序,词法规则如下:
单词符号            种别码          内码
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(); /错误处理/