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