词法分析程序(Lexical Analyzer)要求:

- 从左至右扫描构成源程序的字符流

-  识别出有词法意义的单词(Lexemes

-  返回单词记录(单词类别,单词本身)

-  滤掉空格

-  跳过注释

-  发现词法错误

 

程序结构:

输入:字符流(什么输入方式,什么数据结构保存)

处理:

–遍历(什么遍历方式)

–词法规则

输出:单词流(什么输出形式)

–二元组

 

单词类别:

1.标识符(10)

2.无符号数(11)

3.保留字(一词一码)

4.运算符(一词一码)

5.界符(一词一码)

 

单词符号

种别码

单词符号

种别码

begin

1

:

17

if

2

:=

18

then

3

<

20

while

4

<=

21

do

5

<>

22

end

6

>

23

l(l|d)*

10

>=

24

dd*

11

=

25

+

13

;

26

-

14

(

27

*

15

)

28

/

16

#

0


 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

代码如下:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

char prog[800],token[20];//程序段,单词符号 
char ch;
int syn,p,n,sum,s,i;
char *word[6]={"begin","if","then","while","do","end"};
void compile(){
    for(int i=0;i<20;i++){
      token[i]=NULL;
    }
    ch=prog[p++];
      
    while(ch == ' '){
        ch=prog[p];
        p++;
    }
    if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')){//判断字母 ,标识符 
         s=0;
        while((ch>='0' && ch<='9')||(ch>='a' && ch<='z')||(ch>='A'&&ch<='Z')){
            token[s++]=ch;
            ch=prog[p++];
        }
        p--;
        syn=10;
        for(int n=0;n<6;n++){//保留字 
            if(strcmp(word[n],token)==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;
    }else switch(ch){//加减乘除以及其他符号 
        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;
        case':':
                i=0;
                token[i++]=ch;
                ch=prog[p++];
                if(ch=='='){
                    token[i++]=ch;
                    syn=18;
                }else {
                    syn=17;
                    p--;
                }break;
        case'<':
                i=0;
                token[i++]=ch;
                ch=prog[p++];
                if(ch=='='){
                    token[i++]=ch;
                    syn=21;
                }else if(ch=='>'){
                     token[i++]=ch;
                     syn=22;
                }else{
                    syn=20;
                    p--;
                }break;
        case'>':
                i=0;
                token[i++]=ch;
                ch=prog[p++];
                if(ch=='='){
                    token[i++]=ch;
                    syn=24;
                }else{
                    syn=23;
                    p--;
                    
                }break;
                
         case'\n':syn=-2;break;
             
           default:
                syn=-1;
                break;    
    }
   
} 



int main(){
   p=0;
   int l=1;
    printf("请输入源程序(以#结束):");
    do{
        ch=getchar();
        prog[p++]=ch;
    
    }while (ch!='#');
    
    printf("\n(%s)\n",prog);
    p=0;
    
    do{
    
    compile();
    switch(syn){
        case 11:printf("\n<%d,%d>",syn,sum);break;
        
        case -2:l+=1;break;
        
        case -1:printf("在第%d行有错误!",l);break;
        
        default:printf("\n<%d,%s>",syn,token);break;
    }
 }while(syn!=0);
}

 

 

运行截图:

 

posted on 2019-10-10 21:07  跛豪丶  阅读(195)  评论(0编辑  收藏  举报