zoukankan      html  css  js  c++  java
  • 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;
    }
    
  • 相关阅读:
    cmd输出的日志里有中文乱码的解决办法
    自定义控件ToggleButton滑动开关
    移除指定位置的jsonarray
    设置Listview不滚动
    Volley框架学习
    LoaderManager的使用
    Activity获取Fragment的值
    Fragment和Fragment进行数据传递
    Fragmet的学习
    android ListView上拉加载更多
  • 原文地址:https://www.cnblogs.com/yinyoupoet/p/13287518.html
Copyright © 2011-2022 走看看