一个简单的词法分析器

 

该词法分析器可以处理简单的语法,但有限状态机、正则表达式的处理不是非常严谨;仅供参考

但可以起到启蒙例子的作用,下面源代码经本人确认可以运行;

运行例子如下:

 

 

源代码

#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;

// ref: https://www.cnblogs.com/yanlingyin/archive/2012/04/17/2451717.html
// 博客园 词法分析器的实现

// prog: 输入的源字符串; token: 词素的值
char prog[80],token[8];
char ch;
int syn,p,m=0,n,row,sum=0;    // p: prog的指针;syn:种别码,即词素类型; sum:数字时的token;
char *rwtab[6]={"begin","if","then","while","do","end"};

void scaner()
{
    /*
        共分为三大块,分别是标示符、数字、符号,对应下面的 if   else if  和 else
    */
    for(n=0;n<8;n++) token[n]=NULL;
    ch=prog[p++];
    // 当ch为空格时,指针p向后移;
    while(ch==' ')
    {
        ch=prog[p];
        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'))
        {
            token[m++]=ch;
            ch=prog[p++];
        }
        token[m++]='\0';
        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'))
    {
        {
            sum=0;
            while((ch>='0'&&ch<='9'))
            {
                sum=sum*10+ch-'0';
                ch=prog[p++];
            }
        }
        p--;
        syn=11;
        // 溢出情况
        if(sum>32767)   syn=-1;
    }

    //其他字符
    else switch(ch)
    {
        case'<':
            m=0;
            token[m++]=ch;
            ch=prog[p++];
            if(ch=='>')
            {
                syn=21;
                token[m++]=ch;
            }
            else if(ch=='=')
            {
                syn=22;
                token[m++]=ch;
            }
            else
            {
                syn=23;
                p--;
            }
            break;
        case'>':
            m=0;
            token[m++]=ch;
            ch=prog[p++];
            if(ch=='=')
            {
                syn=24;
                token[m++]=ch;
            }
            else
            {
                syn=20;
                p--;
            }
            break;
        case':':
            m=0;
            token[m++]=ch;
            ch=prog[p++];
            if(ch=='=')
            {
                syn=18;
                token[m++]=ch;
            }
            else
            {
                syn=17;
                p--;
            }
            break;
        case'*':syn=13;token[0]=ch;break;
        case'/':syn=14;token[0]=ch;break;
        case'+':syn=15;token[0]=ch;break;
        case'-':syn=16;token[0]=ch;break;
        case'=':syn=25;token[0]=ch;break;
        case';':syn=26;token[0]=ch;break;
        case'(':syn=27;token[0]=ch;break;
        case')':syn=28;token[0]=ch;break;
        case'#':syn=0;token[0]=ch;break;
        case'\n':syn=-2;break;
        default: syn=-1;break;
    }
}

int main()
{
    // 输入环节
    p=0;
    row=1;
    cout<<"Please input string:"<<endl;
    do
    {
        cin.get(ch);
        prog[p++]=ch;
    }
    while(ch!='#');


    p=0;
    // 每识别出一个token,即输出打印;
    do
    {
        scaner();
        switch(syn)
        {
        case 11: cout<<"("<<syn<<","<<sum<<")"<<endl; break;
        case -1: cout<<"Error in row "<<row<<"!"<<endl; break;
        case -2: row++ ; break;
        default: cout<<"("<<syn<<","<<token<<")"<<endl;break;
        }
    }
    while (syn!=0);
}

 

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,我来为您详细介绍一下如何设计一个C语言词法分析器。 1. 任务 C语言词法分析器的任务是将输入的C代码转化为词法单元序列,识别其中的标识符、关键字、运算符、常量等,并将其分类输出。 2. 正则式表示 C语言的词法单元可以使用正则表达式进行描述。以下是C语言常见词法单元的正则表达式: - 标识符:[a-zA-Z_][a-zA-Z0-9_]* - 关键字:auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|union|unsigned|void|volatile|while - 运算符:+|-|*|/|%|++|--|==|!=|<|>|<=|>=|&&|\|\||!|&|\||^|~|<<|>> - 常量:整数常量|浮点数常量|字符常量|字符串常量 3. 架构设计 C语言词法分析器的架构设计包括以下几个部分: (1)输入接口:负责读取源代码文件,将代码转化为字符流输入给词法分析器。 (2)词法分析器:根据C语言词法单元的正则表达式和自动机算法,将字符流转化为词法单元序列,并将其输出。 (3)符号表:用于记录词法单元的属性值,如标识符的名称、类型等。 (4)输出接口:将词法单元序列输出给语法分析器进行后续处理。 4. 实现步骤 (1)读取源代码文件,将代码转化为字符流输入给词法分析器。 (2)使用正则表达式描述C语言的各种词法单元,将其转化为NFA或DFA自动机。 (3)根据自动机算法,对输入的字符流进行扫描,并将其转化为词法单元序列。 (4)对于每个词法单元,根据其类型和属性值,将其记录到符号表中。 (5)将词法单元序列传递给语法分析器进行后续处理。 以上是一个基本的C语言词法分析器的实现步骤。实际开发中,还需要处理一些特殊情况,如注释、空格、换行符等,以及优化词法分析器的性能和准确性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值