天天看點

c++模拟簡單詞法分析器

編譯原理的基礎之一就是詞法分析,這裡便使用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] = '\0';
    }
}

//判斷是否為數字,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] != '\0'){
        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;
}      

繼續閱讀