词法分析程序

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了词法分析程序相关的知识,希望对你有一定的参考价值。

词法分析程序功能:根据输入的字符串,按照种别码分类识别出对应的单词符号;

 

符号与种别码对照表

单词符号

种别码

单词符号

种别码

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

用文法描述词法规则

<字母>:S→a|b|c|…|X|Y|Z
<数字>:S→0|1|2|…|9
<整数常数>:B→0|1|2|...|9

                 S→B|SB
<标识符>: A→B|AB|AS
B→a|b|c|…|X|Y|Z|_

S→0|1|2|...|9
<关键字>: S→const|var|procedure|begin|end|odd|if|then|call|while|do|read|write
<运算符>: S→+|-|*|/|=|#|<|<=|>|>=|!=
<界符>: S→(|)|,|;|.

运行代码及截图

#include<stdio.h>
#include<string.h>
void Fenxi(char c,char b);
void word(char a[]);
void number(char a[]);
int i; 
int s=1; 
main(){
    char a[50];
    printf("请输入源程序:");
    gets(a);
    printf("您要分析的源程序为:");
    printf("%s",a);
    printf("\\n");
    for(i=0;(a[i]!=\\0)&&(i<50)&&s==1;i++)
    {
        if((a[i]>=a && a[i]<=z)||(a[i]>=A && a[i]<=Z))
            word(a);
        else if(a[i]>=0 && a[i]<=9)
            number(a);
        else
            Fenxi(a[i],a[i+1]);
    }
    printf("\\n");
}

void number(char a[])  
{
    char b[50];
    int m,k=0,t;
    m=i;
    while(a[m]>=0 && a[m]<=9)  
    {
        b[k]=a[m];   
        k++;
        m++;
    }
    i=m-1;
    printf("(11,");
    for(t=0;t<k;t++)
            printf("%c",b[t]);
    printf(")");
    printf("\\n");
}

void word(char a[])   
{
    int k=0,m,flag=0,t;
    char b[50];
    char *key[6]={"begin","if","then","while","do","end"};
    m=i;
    while((a[m]>=a&&a[m]<=z)||(a[m]>=A&&a[m]<=Z))  
    {
        b[k]=a[m];   
        k++;
        m++;
        b[k]=\\0;

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            
    }
    i=m-1;
    for(t=0;t<6;t++)
    {
        if(strcmp(b,key[t])==0)  
        {
            printf("(%d,%s)",t+1,key[t]);  
            flag=1;
            printf("\\n");
        }
    }
    if(flag==0)
    {
        printf("(10,%s)",b);   
        printf("\\n");
    }
}
void Fenxi(char c,char b)  
{
    switch(c){
        case  :
            break;
        case +:
            printf("(13,+)\\n");
            break;
        case -:
            printf("(14,-)\\n");
            break;
        case *:
            printf("(15,*)\\n");
            break;
        case /:
            printf("(16,/)\\n");
            break;
        case ::
            if(b===)
            {
                i++;
                printf("(18,:=)\\n");
            }
            else
                printf("(17,:)\\n");
            break;
        case <:
            if(b==>)
            {
                i++;
                printf("(21,<>)\\n");
            }
            else if(b===)
            {
                i++;
                printf("(22,<=)\\n");
            }
            else
                printf("(20,<)\\n");
            break;
        case >:
            if(b===)
            {
                printf("(24,>=)\\n");
                i++;
            }
            else
                printf("(23,>)\\n");
            break;
        case =:
            printf("(25,=)\\n");
            break;
        case ;:
            printf("(26,;)\\n");
            break;
        case (:
            printf("(27,()\\n");
            break;
        case ):
            printf("(28,))\\n");
            break;
        case #:
            printf("(0,#)\\n");
            break;
        default:
            {
            printf("\\n存在字符 ‘%c‘,无法继续识别!\\n",c);
            s=0;    
            break;
            }
    }
}

技术分享

以上是关于词法分析程序的主要内容,如果未能解决你的问题,请参考以下文章

词法分析

词法分析程序的实现

Second-词法分析

词法分析程序源代码

实验词法分析实验

词法分析程序