编译原理实验----词法分析

 
实验一   词法分析
 
.实验的目的和要求:
1 .掌握自动机技术应用于词法分析的基本方法。
2 .自动机的实现原理。
3 .用自动机如何实现词法分析。
.实验的内容:
micro 语言中所用到的单词有:
(1)        标识符:字母打头的字母 / 数字串
(2)        整常数:数字打头的数字串
(3)        符号词:‘ + ‘:’‘: = ;’ ‘<=’’<’
三、实现要求:
1 、构造能识别上述单词的自动机。
2 、用 C 语言实现所构造的自动机。要求:若输入一个自动机所不能接受的字符串,计算机输出相应的错误信息,若输入一个此自动机所能接收的字符串,计算机则输出此字符串的 TOKEN 码;并且每个单词的 TOKEN 码输出列表如下:
identifier------------------------( § id,Name)
number ------------------------( §int,Numb)
+----------------------------------( §plus,”)
; ----------------------------------( §semi,”)
:=---------------------------------( §assi,”)
: --------------------------------( §colon,”)
<=---------------------------------( §le,”)
< --------------------------------- ( §lt,”)
其中 Name 是标识符名,而 Numb 是正整数(未翻译)。

#include   " iostream.h "
#include  
" string.h "

void  Getchars( char   * ch)
{
    cout
<<"请输入一个字符串!"<<endl;
    cin
>>ch;
}

void  Identifier( char   * ch)

{
    
int n=0;
    n
=strlen(ch);//计算字符串CH的(unsigned int型)长度
    if(n==1)
    
{
        cout
<<"($ id,"<<ch<<")"<<endl;
        
return;
    }

    
for(int i=1;i<n;i++)
    
{
        
if(ch[i]<48){cout<<"输入的字符串在此编译器中非法的!"<<endl;return;}//48=0
        if(ch[i]>57&&ch[i]<65){cout<<"输入的字符串在此编译器中非法的!"<<endl;return;}//57=9@@67=A
        if(ch[i]>90&&ch[i]<97){cout<<"输入的字符串在此编译器中非法的!"<<endl;return;}//90=Z@@97=a
        if(ch[i]>122){cout<<"输入的字符串在此编译器中非法的!!"<<endl;return;}//122=小写Z    
    }

    cout
<<"($ identifier,"<<ch<<")"<<endl;
}

void  Numbers( char   * ch)
{
    
int n=0;
    n
=strlen(ch);
    
for(int i=0;i<n;i++)
    
{
        
if(ch[i]<48||ch[i]>57)
        
{
            cout
<<"输入的字符串在此编译器中非法的!!"<<endl;return;    
        }

    }

    cout
<<"($ int,"<<ch<<")"<<endl;
}

void  Signs( char   * ch)
{
    
int n=0;
    n
=strlen(ch);
    
if(n==1)
    
{
        
switch(ch[0])
        
{
        
case '+':
            cout
<<"($ plus"<<")"<<endl;
            
break;
        
case ';':
            cout
<<"($ semi"<<")"<<endl;
            
break;
        
case ':':
            cout
<<"($ colon"<<")"<<endl;
            
break;
        
case '<':
            cout
<<"($ lt"<<")"<<endl;
            
break;
        
default:
            cout
<<"输入的字符串在此编译器中非法的!"<<endl;
            
return;
        }

    }

    
else if(n==2)
    
{
        
switch(ch[0])
        
{
        
case ':':
            
if(ch[1]=='=')
            cout
<<"($ assi,:="<<")"<<endl;
            
else cout<<"输入的字符串在此编译器中非法的!"<<endl;
            
break
        
case '<':
            
if(ch[1]=='=')
            cout
<<"($ le,<="<<")"<<endl;
            
else cout<<"输入的字符串在此编译器中非法的!"<<endl;
            
break;
        
case '>':
            
if(ch[1]=='=')
            cout
<<"($ he,>="<<")"<<endl;
            
else cout<<"输入的字符串在此编译器中非法的!"<<endl;
            
break;
        
default:
            cout
<<"输入的字符串在此编译器中非法的!"<<endl;
            
return;
        }

    }

    
else
    
{
        cout
<<"输入的字符串在此编译器中非法的!"<<endl;
        
return;
    }

}



void  main()
{
    
char ch[20];
    
int num=0;
    
for(;;)
    
{
        num
++;
        Getchars(ch);
        
if((ch[0]>=65&&ch[0]<=90)||(ch[0]>=97&&ch[0]<=122))Identifier(ch);
        
else if(ch[0]>=48&&ch[0]<=57)Numbers(ch);
        
else Signs(ch);
        
if(num>61)return;
    }

}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值