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

词法分析程序

时间:2016-10-01 00:21:42      阅读:257      评论:0      收藏:0      [点我收藏+]

标签:

1.词法分析程序的功能:

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

输出:二元组构成的序列。

其中:syn为单词种别码。

token为存放的单词自身字符串。


2.符号与种别码的对照表技术分享

3.词法规则

<字母> A a|b|c|……y|z
<数字>
A→1|2|3|4|5|6|7|8|9
S→A|SA|SA0
<整数常数>
A→1|2|3|4|5|6|7|8|9
S→A|SA|SA0
<标识符>
A→a|b|c|……y|z
B→0|1|2|3|4|5|6|7|8|9
S→A|SB
<关键字>
S→if|else|while|do|for|int|char|……
<运算符>
S→+|-|x|/|=|#|<|>|<=|>=|:=
<界符>
S→(|)|,|;|.

4.源代码与调试程序截图技术分享

#include <stdio.h>    
#include <string.h>       
char prog[80],token[8],ch;    
int syn,p,m,n,sum;    
char *rwtab[6]={"begin","if","then","while","do","end"};         
void scaner(void);        
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();    
                    return 0;    
                break;    
                    
                default:     
                printf("( %-10s%5d )\n",token,syn);    
                break;    
            }    
        }while(syn!=0);    
    return 0;//getch();    
 }    
    
void scaner()    
{      
    sum=0;    
    for(m=0;m<8;m++)    
        token[m]=0;    
        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;    
} 

 

词法分析程序

标签:

原文地址:http://www.cnblogs.com/chenguangpeng/p/5925044.html

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