简易的词法分析程序

Posted

tags:

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

#include <stdio.h>
#include <string.h>
char prog[666],token[8],ch;
int syn,p,m,n,sum;
char *rwtab[6]={"begin","if","then","while","do","end"};
scaner();
main()
{
    p=0;
    printf("\\n please input a string(end with ‘#‘):\\n");
    do{
        scanf("%c",&ch);
        prog[p++]=ch;
    }while(ch!=#);
    p=0;
    do{
        scaner();
        switch(syn)
        {
            case 11:printf("( %-10d%5d )\\n",sum,syn);
            break;
            case -1:printf("you have input a wrong string\\n");
            getch();
            exit(0);
            default: printf("( %-10s%5d )\\n",token,syn);
            break;
        }
    }while(syn!=0);
    getch();
}
    scaner()
    {  
        sum=0;
    for(m=0;m<8;m++)token[m++]=NULL;
    ch=prog[p++];
    m=0;
    while((ch== )||(ch==\\n))ch=prog[p++];
    if(((ch<=z)&&(ch>=a))||((ch<=Z)&&(ch>=A)))
    { 
        while(((ch<=z)&&(ch>=a))||((ch<=Z)&&(ch>=A))||((ch>=0)&&(ch<=9)))
        {
            token[m++]=ch;
            ch=prog[p++];
        }
        p--;
        syn=10;
        for(n=0;n<6;n++)
            if(strcmp(token,rwtab[n])==0)
                { 
                    syn=n+1;
                    break;
                }
    }
    else if((ch>=0)&&(ch<=9))
    { 
        while((ch>=0)&&(ch<=9))
        { 
            sum=sum*10+ch-0;
            ch=prog[p++];
        }
        p--;
        syn=11;
    }
    else switch(ch)
    { 
        case <:token[m++]=ch;
            ch=prog[p++];
            if(ch===)
            {  
                syn=22;
                token[m++]=ch;
            }
            else
            {  
                syn=20;
                p--;
            }
            break;
        case >:token[m++]=ch;
            ch=prog[p++];
            if(ch===)
            { 
                syn=24;
                token[m++]=ch;
            }
            else
            { 
                syn=23;
                p--;
            }
            break;
        case +: token[m++]=ch;
            ch=prog[p++];
            if(ch==+)
            { 
                syn=17;
                token[m++]=ch;
            }
            else
            { 
                syn=13;
                p--;
            }
            break;
        case -:token[m++]=ch;
            ch=prog[p++];
            if(ch==-)
            { 
                syn=29;
                token[m++]=ch;
            }
            else
            { 
                syn=14;
                p--;
            }
            break;
        case !:ch=prog[p++];
            if(ch===)
            { 
                syn=21;
                token[m++]=ch;
            }
            else
            { 
                syn=31;
                p--;
            }
            break;
        case =:token[m++]=ch;
            ch=prog[p++];
            if(ch===)
            {    
                syn=25;
                token[m++]=ch;
            }
            else
            { 
                syn=18;
                p--;
            }
            break;
        case *: syn=15;
            token[m++]=ch;
            break;
        case /: syn=16;
            token[m++]=ch;
            break;
        case (: syn=27;
            token[m++]=ch;
            break;
        case ): syn=28;
            token[m++]=ch;
            break;
        case {: syn=5;
            token[m++]=ch;
            break;
        case }: syn=6;
            token[m++]=ch;
            break;
        case ;: syn=26;
            token[m++]=ch;
            break;
        case \\": syn=30;
            token[m++]=ch;
            break;
        case #: syn=0;
            token[m++]=ch;
            break;
        case ::syn=17;
            token[m++]=ch;
            break;
        default: syn=-1;
            break;
            }
    token[m++]=\\0;
    printf("感谢您使用本程序!");
}

技术分享技术分享

 

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

简易词法分析器

编译原理 实验一 java语言实现对C语言词法分析

编译原理 实验一 java语言实现对C语言词法分析

Java 实现《编译原理》简单词法分析功能

C语言编译器开发之旅:词法分析扫描器

词法分析