c++模拟简单词法分析器

编译原理的基础之一就是词法分析,这里便使用c++简单模拟了一个词法分析器。

这个词法分析器的状态转换图如下:
这里写图片描述

而我的运行截图如下:
这里写图片描述

代码如下:

#include<bits/stdc++.h>
using namespace std;

#define MAX_LEN 200


//将一个字符串内容清空
void clearArray(char *c)
{
    int len = strlen(c);
    for(int i = 0; i < len; i++)
    {
        c[i] = '';
    }
}

//判断是否为数字,true为是,false为不是
bool isDigit(char c){
    if(c >= '0' && c <= '9')
    {
        return true;
    }
    else
    {
        return false;
    }
}

//判断是否为字母,ture为是,false为不是
bool isChar(char c)
{
    if( (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') )
    {
        return true;
    }
    else
    {
        return false;
    }
}


/*
* 单词输出函数
* @param label 该单词的意义
* @param word 经过词法分析器分析后得到的单个单词
*/
void print(string label, char *word)
{
    cout<<label<<":  "<<word<<endl;
}



/*
* 词法分析函数
* @param inChar 输入字符串指针
* 该函数对输入串进行分析,并分割成单词后输出
*/
void analysis(char* inChar)
{

    //用于对词法分析后的单词进行保存
    char tempChar[MAX_LEN] = {0};
    // 作为tempChar的一个索引
    int j = 0;

    //用于遍历inChar字符数组
    int i = 0;
    while(inChar[i] != ''){
        switch(inChar[i])
        {
        case '-':
            tempChar[j++] = inChar[i];
            print("减号",tempChar);
            j = 0;
            clearArray(tempChar);
            break;
        case '+':
            tempChar[j++] = inChar[i];
            print("加号",tempChar);
            j = 0;
            clearArray(tempChar);
            break;
        case ',':
            tempChar[j++] = inChar[i];
            print("逗号",tempChar);
            j = 0;
            clearArray(tempChar);
            break;
        case '(':
            tempChar[j++] = inChar[i];
            print("左括号",tempChar);
            j = 0;
            clearArray(tempChar);
            break;
        case ')':
            tempChar[j++] = inChar[i];
            print("右括号",tempChar);
            j = 0;
            clearArray(tempChar);
            break;
        case '*':
            if(inChar[i+1] != '*')
            {
                tempChar[j++] = inChar[i];
                print("乘法",tempChar);
                j = 0;
                clearArray(tempChar);
            }
            else
            {
                tempChar[j++] = inChar[i++];
                tempChar[j++] = inChar[i];
                print("平方",tempChar);
                j = 0;
                clearArray(tempChar);
            }
            break;
        default:
            //判断是否为字母+数字
            if(isChar(inChar[i]))
            {
                j=0;
                tempChar[j++] = inChar[i];
                while(isChar(inChar[i+1]) || isDigit(inChar[i+1]))
                {
                    i++;
                    tempChar[j++] = inChar[i];
                }
                j = 0;
                print("字母+数字",tempChar);
                clearArray(tempChar);
            }
            else if(isDigit(inChar[i]))
            {
                j = 0;
                tempChar[j++] = inChar[i];
                while(isDigit(inChar[i+1]))
                {
                    i++;
                    tempChar[j++] = inChar[i];
                }
                j = 0;
                print("数字",tempChar);
                clearArray(tempChar);
            }
            else
            {
                tempChar[j++] = inChar[i];
                print("其他",tempChar);
                j = 0;
                clearArray(tempChar);
            }
        }

        i++;
    }
}



int main()
{
    char inChar[MAX_LEN] = {0};

    //获取输入字符串,输入的字符串以空格、回车、换行作为结束符
    cin>>inChar;

    //对输入的字符串进行分析
    analysis(inChar);

   return 0;
}
原文地址:https://www.cnblogs.com/yinyoupoet/p/13287518.html