词法分析程序

1.词法分析程序的功能

I:对字符串表示的源程序

P:根据词法规则从左到右进行扫描和分解

O:识别出一个一个具有独立意义的单词符号以供语法分析之用

E:发现语法错误,则返回出错信息

2.符号与种别码的对照表

3.词法规则

4.代码与运行结果截图

#include<stdio.h>
#include<string.h>
void scaner();
main()
{
    int p=0,row=1;
    char prog[80],token[8],ch;  
    int syn,m,n,sum;  
    char *rwtab[6]={"begin","if","then","while","do","end"}; 
    printf("词法分析\n");
    printf("请输入一段程序(以#结束):");
    do{
        scanf("%c",&ch);
        prog[p++]=ch;
    }while(ch!='#');
    printf("词法分析结果如下:");
    do{  
            scaner(ch,prog,token);  
            switch(syn)  
            {  
                case 11:  
                    printf("( %-10d%5d )\n",sum,syn);  
                break;  
                case -1:  
                    printf("you have input a wrong string\n");   
                    return 0;  
                break;   
                default:   
                printf("( %-10s%5d )\n",token,syn);  
                break;  
            }  
        }while(syn!=0);  
}
void scaner(char ch, char prog[80],char token[8],)  
{    
    int 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';  
}  

 

转载于:https://www.cnblogs.com/swxvico/p/5923832.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值