词法分析程序

本文介绍了一个简单的词法分析程序的设计与实现过程。该程序能够读取字符串形式的源代码,识别并返回不同类型的单词符号及其种别码,如关键字、标识符、整数等,并能处理基本的运算符和括号。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

词法分析:

编制一个词法分析程序

 

对字符串表示的源程序,从左到右进行扫描和分解,根据词法规则,识别出一个一个具有独立意义的单词符号,以供语法分析之用 发现词法错误,则返回出错信息。

 

 

各种单词符号对应的种别码。

 

 

 

 

#include<stdio.h>
#include<string.h>
char str[100];
char take[8];//存放单词符号的字符串
int sum;//存放整数型单词
char ch;
int zbm;//存放单词字符的种别码
int i,p,m=0;//p是缓冲区str的指针,m是take的指针
char *keyword[8]={"begin","if","then","while","do","end","l(l|d)*","dd*"};
void scanner()//词法扫描程序
{

   /* for(i=0;i<8;i++)
    {
        take[i]=NULL;
    }
    ch=str[p++];*/
    m=0;
    while(ch==' ')
    {
        ch=str[p++];

    }
    if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))//可能是标识符或者是变量名
    {
        m=0;
        while(ch>='0'&&ch<='9'||(ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))
        {
            take[m++]=ch;
            ch=str[p++];
        }
        take[m++]='\0';
        p--;
        zbm=10;
        for(i=0;i<6;i++)//将识别出的字符和已定义的标符进行比较
            if(strcmp(keyword[i],take==0))
        {
            zbm=i+1;
            break;
        }
    }
    else if(ch>='0'&&ch<='9')
    {
        sum=0;
        while(ch>='0'&&ch<='9')
        {
            sum=sum*10+ch-'0';
            ch=str[p++];
        }
        p--;
        zbm=11;
    }
    else
    {
        switch(ch)
        {
            case '+':
                zbm=13;
                take[0]=ch;
                ch=str[p++];
                break;
            case '-':
                zbm=14;
                take[0]=ch;
                ch=str[p++];
                break;
            case '*':
                zbm=15;
                take[0]=ch;
                ch=str[p++];
                break;
            case '/':
                zbm=16;
                take[0]=ch;
                ch=str[p++];
                break;


            case '<':
                m=0;
                take[m++]=ch;
                ch=str[p++];
                if(ch=='>')
                {
                    zbm=21;
                    take[m++]=ch;
                }
                else if(ch=='=')
                {
                    zbm=22;
                take[m]=ch;
                }
                else
                    zbm=20;
                break;
            case '>':
                take[0]=ch;
                ch=str[p++];
                if(ch=='=')
                {
                    zbm=24;
                take[0]=ch;
                }
                else
                    zbm=23;
                break;
            case ':':
                take[0]=ch;
                ch=str[p++];
                if(ch=='=')
                {
                    zbm=18;
                take[m++]=ch;
                ch=str[p++];
                }
                else
                    zbm=17;
                break;

            case '=':
                zbm=25;
                take[0]=ch;
                ch=str[p++];
                break;
            case ';':
                zbm=26;
                take[0]=ch;
                ch=str[p++];
                break;
            case '(':
                zbm=27;
                take[0]=ch;
                ch=str[p++];
                break;
            case ')':
                zbm=28;
                take[0]=ch;
                ch=str[p++];
                break;
            case '#':
                zbm=0;
                take[0]=ch;
                ch=str[p++];
                break;
            default:
                zbm=-1;

        }
    }
}
main()
{

    int n,i;
    printf("----------------------------------------\n");
    printf("\t编制一个词法分析程序\n\n");
    printf("\t要求:\n");
    printf("\t输入:源程序字符串\n");
    printf("\t输出:二元组(种别,单词本身)\n");
    printf("----------------------------------------\n\n");


    printf("请输入您要输入的字符:\n");
    do//输入一段字符串
    {
        ch=getchar();
        str[p++]=ch;
    }while(ch!='#');
    p=0;
    ch=str[0];
    if(ch>='0'&&ch<='9')
        printf("错误!\n");
    else
    {
        do
        {
            scanner();
            switch(zbm)
            {
            case 11:
                printf("(%d,%d)\n",11,sum);
                break;
            case -1:
                printf("错误!\n");
                break;
            default:
                printf("(%d,%s)\n",zbm,take);
            }
        }while(zbm!=0);
    }
}

  

  

转载于:https://www.cnblogs.com/zhiling123/p/5925173.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值