作业9.30

词法分析程序的功能

1.完成词法分析任务的程序称为词法分析程序或词法分析器或扫描器。 
2.从左至右地对源程序进行扫描,按照语言的词法规则识别各类单词,并产生相应单词的属性字。

 
 

#include<stdio.h>                  /*定义I/O库所用的某些宏和变量*/
#include<string.h>               /*定义字符串库函数*/
#include<conio.h>                  /*提供有关屏幕窗口操作函数*/
#include<ctype.h>                  /*分类函数*/
char prog[80]={'\0'},
     token[8];                     /*存放构成单词符号的字符串*/
char ch;
int syn,                           /*存放单词字符的种别码*/
      n,
    sum,                           /*存放整数型单词*/
    m,p;                           /*p是缓冲区prog的指针,m是token的指针*/
char *rwtab[6]={"begin","if","then","while","do","end"};
void scaner(){
    m=0;
    sum=0;
    for(n=0;n<8;n++)
        token[n]='\0';
    ch=prog[p++];
    while(ch==' ')
        ch=prog[p++];
    if(isalpha(ch))    /*ch为字母字符*/
 {
        while(isalpha(ch)||isdigit(ch))    /*ch 为字母字符或者数字字符*/
  {
           token[m++]=ch;
           ch=prog[p++];}
        token[m++]='\0';
        ch=prog[p--];
        syn=10;
        for(n=0;n<6;n++)
            if(strcmp(token,rwtab[n])==0)    /*字符串的比较*/
   {
                syn=n+1;
                break;}}
    else
        if(isdigit(ch))    /*ch是数字字符*/
  {
            while(isdigit(ch))    /*ch是数字字符*/
   {
                sum=sum*10+ch-'0';
                ch=prog[p++];}
            ch=prog[p--];
            syn=11;}
        else
            switch(ch)
  {
                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;
                                 ch=prog[p--];}
                        break;
                case'>':m=0;token[m++]=ch;ch=prog[p++];
                        if(ch=='='){
                            syn=24;
                            token[m++]=ch;}
                        else{
                            syn=23;
                            ch=prog[p--];}
                        break;
             case':':m=0;token[m++]=ch;ch=prog[p++];
                     if(ch=='='){
                         syn=18;
                         token[m++]=ch;}
                     else{
                         syn=17;
                         ch=prog[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=25;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;}}
main()
{

p=0;
    printf("please input string:\n");
    do {
           ch=getchar();
           prog[p++]=ch;
       }while(ch!='#');
    
p=0;
    do{
        scaner();
        switch(syn){
            case 11: printf("(%d,%d)\n",syn,sum);break;
          //  case -1: printf("\n ERROR;\n");break;
            default: printf("(%d,%s)\n",syn,token);
}
}while(syn!=0);
    //getch();
}

 

 

用文法描述词法则

<字母>:
S→A
A→a|b|c|……y|z

<数字> :
S→A|SA|SA0
A→1|2|3|4|5|6|7|8|9

<整数常数>:
S→A|SA|SA0
A→1|2|3|4|5|6|7|8|9

<标识符>:
S→A|SB
A→a|b|c|……y|z
B→0|1|2|3|4|5|6|7|8|9

<关键字>:
S→A
A→if|else|while|do|for|int|char|……

<运算符>:
S→A
A→+|-|x|/|=|#|<|>|<=|>=|:=

<界符>:
S→A
A→(|)|,|;|.

 
 
 
posted @ 2016-09-30 17:34  097黄大贞  阅读(112)  评论(0编辑  收藏  举报