编译原理的基础之一就是词法分析,这里便使用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;
}