词法分析

Posted

tags:

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

词法分析程序的功能:

输入:所给文法的源程序字符串。

输出:二元组(syn,token或sum)构成的序列。

 

符号与种别码对照表:

技术分享

用文法描述词法规则:

关键字,也称基本字,if, then, while, do等
标识符,表示各种名字,如变量名、数组名、函数名等,如char ch, int syn, token,sum
常数,如123,4587
运算符,如+, -, *, /, :=, <=, >, <>等
界符,,;():等

 

代码:

#include<stdio.h>                
#include<string.h>              
#include<conio.h>                 
#include<ctype.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))   
    {
        while(isalpha(ch)||isdigit(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))   
        {
            while(isdigit(ch))   
            {
                sum=sum*10+ch-0;
                ch=prog[p++];
            }
            ch=prog[p--];
            syn=11;}
        else
            switch(ch)
        {
                case<:m=0;token[m++]=ch;ch=prog[p++];
                        if(ch==>)
                        {
                            syn=21;
                            token[m++]=ch;}
                        else if(ch===)
                        {
                            syn=22;
                            token[m++]=ch;
                        }
                            else
                            {
                                 syn=20;
                                 ch=prog[p--];
                            }
                        break;
                case>:m=0;token[m++]=ch;ch=prog[p++];
                        if(ch===)
                        {
                            syn=24;
                            token[m++]=ch;
                        }
                        else{
                            syn=23;
                            ch=prog[p--];
                        }
                        break;
             case::m=0;token[m++]=ch;ch=prog[p++];
                     if(ch===)
                     {
                         syn=18;
                         token[m++]=ch;
                     }
                     else{
                         syn=17;
                         ch=prog[p--];
                     }
                     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=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;
             default:syn=-1;
        }
}
main()
{

p=0;
    printf("请输入词法(以#结束):\\n");
    do {
           ch=getchar();
           prog[p++]=ch;
       }while(ch!=#);
     
p=0;
    do{
        scaner();
        switch(syn)
        {
            case 11: printf("(%d,%d)\\n",syn,sum);break;
            default: printf("(%d,%s)\\n",syn,token);
        }
    }while(syn!=0);
}

技术分享

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

词法分析

词法分析器代码复审

实验一 词法分析器+编译原理

Second-词法分析

词法分析器

js词法分析