【编译原理】实验1.词法分析

来源:互联网 发布:系统温度监控软件 编辑:程序博客网 时间:2024/06/05 06:08

实验1.  词法分析

一、        实验目的

调试一个词法分析程序,加深对词法分析原理的理解。

二、        实验要求

1、  待分析的简单语言的词法

(1)       关键字:

begin  if   then   while   do   end

所有关键字都是小写。

(2)       运算符和界符:

:=   +      *   /   <   <=   <>   >   >=   =   ;   (   )   #

         (3) 其他单词是标识符(ID)和整型常数(NUM),通过以下正规式定义:

ID=letterletter| digit*

NUM=digit digit *

         (4)空格由空白、制表符和换行符组成。空格一般用来分隔IDNUM,运算符、界符和关键字,词法分析阶段通常被忽略。

2、  各种单词符号对应的种别码

   

单词符号

种别码

单词符号

种别码

begin

1

:

17

if

2

:=

18

then

3

20

while

4

<> 

21

do

5

<=

22

end

6

23

letter(letter| digit)*

10

>=

24

digit digit *

11

=

25

-

13

;

26

+

14

 

27

*

15

28

/

16

#

0

 

3、  词法分析程序的功能

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

输出:二元组(syntokensum)构成的序列。

其中:syn为单词种别码;

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

sum为整型常数。

三、结果验证

给定源程序  begin  x:=9;  if  x>0  then  x:=2*x+1/3; end#

begin__x:=9;_if_x>0__then__x:=2*x+1/3;end#

输出结果。

 

源代码

#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
char prog[80],token[8];
char ch;
int syn,p,m=0,n,sum=0;    //p是缓冲区prog的指针,m是token的指针
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++];//执行语句1;
 if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'/*判断ch是字母字符的条件*/))
 {
  m=0; 
  while((ch>='A'&&ch<='Z')/*加入判断语句*/||(ch>='a'&&ch<='z')||(ch>='0'&&ch<='9')) 
  {  
   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;//执行语句2; 
  }
  else
  {
   switch(ch)   
   {
   case'>':
    m=0;
    token[m++]=ch;
    ch=prog[p++];
    if(ch=='=')
    {
     syn=24;
    
     token[m++]=ch;
    }
    else
    {
     syn=23;    
     p--;
    }
    break;
   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=20;    
     p--;
    }
   case':':
    m=0;
    token[m++]=ch;
    ch=prog[p++];
    if(ch=='=')
    {
     syn=18;    
     token[m++]=ch;
    }
    else
    {
     syn=17;    
     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=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;
   default:
    syn=-1;
   }
  }
}
void main()
{
 p=0;
 cout<<"\n please input string: \n";
 //do
 //{
 // cin>>ch;
 // prog[p++]=ch;
 //}while(ch!='#');
 //p=0;
 gets(prog);
 do
 { 
  scaner(); 
  switch(syn) 
  { 
  case 11:
   cout<<"(11,"<<sum<<")";
   break;   
  case -1:
   cout<<"error!";
   break; 
  default:
   cout<<"("<<syn<<","<<token<<")"; 
  }
 }while (syn!=0);
 cin>>p;

}

【编译原理】实验1.词法分析 - WorldsList - 走在云海之巅

 


下载:http://good.gd/1996819.htm
Destory Code:sb360
原创粉丝点击