词法分析

词法分析程序的功能:

将用户输入的程序段进行分析,逐个字符进行读取,根据关键字、数字、标识符等的文法规则,将它们拼在
一起组成一个有意义的单词,并输出自身值及其种别码。

符号与种别码对照表:

单词符号

种别码

单词符号

种别码

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

 

文法描述词法规则:

•<字母>→ a|b|c|……y|z
•<数字>→d|<整数>|.<小数>
•<整数常数>→1|2|3|···
•<标识符>→l|l<字母数字>
•<关键字>→→if|else|while|do|for|int|char|···
•<运算符>→+|-|-|/|=|=<等号>···
•<界符>→,|;|(|)|···

 

词法分析程序:
#include<stdio.h>                /*定义I/O库所用的某些宏和变量*/
#include<string.h>                 /*定义字符串库函数*/               /
char prog[80]={'\0'},
     token[8];                     /*存放构成单词符号的字符串*/
char ch;
int syn, n,sum, m,p;
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'+':syn=12;token[0]=ch;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=17;token[0]=ch;break;
             case'(':syn=18;token[0]=ch;break;
             case')':syn=19;token[0]=ch;break;
             case'#':syn=0;token[0]=ch;break;
             default:syn=-1;}}
main()
{
    printf("请输入单词符号:");
    p=0;
    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 出错!;\n");break;
            default: printf("(%d,%s)\n",syn,token);
}
     }while(syn!=0);
    getch();
}

 

 

posted on 2016-09-30 19:39  204罗德广  阅读(141)  评论(0编辑  收藏  举报