码迷,mamicode.com
首页 > 其他好文 > 详细

词法分析程序

时间:2016-10-01 21:59:48      阅读:162      评论:0      收藏:0      [点我收藏+]

标签:

    这次的实验是编制一个词法分析程序,要求,输入:源程序的字符串,输出:二元组(种别,单词符号本身)。只要根据字符串的不同性质分组,代入到不同的种别码,然后可以输出了

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char sum[100],ch,token[100];
int a=0,zbm,n,i;
char *keyword[18]={"begin","and","const","long","float","double","void","main","if","else","then","break","int","char","include","for","while","printf"};
void scaner();


void main()
{
    printf("请输入一段你想测试的单词符号, 以‘#’号作为结束符号 !\n");
    do
    {
        ch=getchar();//输入字符
        sum[a++]=ch;//把字符存到数组里
    }while(ch!=#);//以#为循环条件
    a=0;
    
    do
    {
        scaner();
        printf("<%d,%s>\n",zbm,token);
      
    }while(zbm!=0);

    printf("感谢使用该系统\n");
    
    getchar();
    
}
void scaner()
{
    
    
    for(n=0;n<100;n++)
    {token[n]=\0;}
    n=0;
    ch=sum[a++];//全局变量p=0
    while(ch== ){ch=sum[a++];}//有空格就继续(判断标识符前是否存在空格)
    
    if((ch>=a&&ch<=z)||(ch>=A&&ch<=Z))
    {
        do{
            token[n++]=ch;
            ch=sum[a++];
        }while((ch>=a&&ch<=z)||(ch>=a&&ch<=z)||(ch>=0&&ch<=9));
        zbm=21;
        
        for(n=0;n<18;n++)
        {
            if(strcmp(token,keyword[n])==0)//判断英文是否和关键字完全一样
        {
            zbm=n+1;
            
        }
        }
        a--;
    
    }
    else if(ch>=0&&ch<=9)
    {
        a--;
        do
        {
            token[n++]=sum[a++];
            ch=sum[a];
        }while(ch>=0&&ch<=9);
        zbm=22;
        
        
        return;
    }
    else
    {
        
    
        switch(ch)
        {
        case +:zbm=24;token[0]=ch;break;
        case -:zbm=25;token[0]=ch;break;
        case *:zbm=26;token[0]=ch;break;
        case /:zbm=27;token[0]=ch;break;
        case ::zbm=28;token[0]=ch;
            ch=sum[a++];
            if(ch===){token[1]=ch;zbm++;}
            else a--;
            break;
        case <:zbm=30;token[0]=ch;
            ch=sum[a++];
            if(ch===){token[1]=ch;zbm++;}
            else if(ch==>){token[1]=ch;zbm=zbm+2;}
            else a--;
            break;
        case >:zbm=33;token[0]=ch;
            ch=sum[a++];
            if(ch===){token[1]=ch;zbm++;}
            else a--;
            break;
        case =:zbm=35;token[0]=ch;break;
        case ;:zbm=36;token[0]=ch;break;
        case (:zbm=37;token[0]=ch;break;
        case ):zbm=38;token[0]=ch;break;
        case {:zbm=39;token[0]=ch;break;
        case }:zbm=40;token[0]=ch;break;
        case !:zbm=41;token[0]=ch;break;
        case @:zbm=42;token[0]=ch;break;
        case $:zbm=43;token[0]=ch;break;
        case %:zbm=44;token[0]=ch;break;
        case ^:zbm=45;token[0]=ch;break;
        case &:zbm=46;token[0]=ch;break;
        case #:zbm=0;token[0]=ch;break;
            
        default: printf("词法分析出错! 请检查是否输入非法字符\n");zbm=-1;break;
            
        }
        

    }
    
}

 

以下为源代码编译结果

技术分享

 

以下为我编写的种别码

技术分享

 

词法分析程序

标签:

原文地址:http://www.cnblogs.com/yjwamao/p/5926303.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!