首页 > 代码库 > 词法分析

词法分析

词法分析程序的功能:

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

符号与种别码对照表:

单词符号

种别码

单词符号

种别码

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();}

 

 

词法分析