词法分析程序

Posted

tags:

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

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;    
} 

 

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

词法分析

词法分析程序的实现

Second-词法分析

词法分析程序源代码

实验词法分析实验

词法分析程序