小C语言--词法分析程序
include<bits/stdc++.h>
using namespace std;
string str[]={"main","if","else","for","while","int"}; // 存储需要识别的6个关键词
// 界符boundary和运算符operator直接在main函数中输出
// show函数只用于判断 整数integer、关键字keyword、自定义标识符identifier
void show(string s)//接收一个字符串s,判断其类型并按格式输出
{
if(isdigit(s[0]))//// 若字符串首字符是数字(0-9),则判断为整数
{
cout<<"(integer,"<<s<<")"<<endl; // 输出整数格式
}
else// 首字符不是数字,进一步判断是否为关键词或标识符
{
bool flag=0;// 标记是否为关键词(0:否,1:是)
for(int i=0;i<6;i++)
{
if(s==str[i])
{
flag=1;//标记为关键词
cout<<"(keyword,"<<s<<")"<<endl; // 输出关键词格式
}
}
if(flag==0)// 若不是关键词(且首字符非数字),则判断为标识符
{
cout<<"(identifier,"<<s<<")"<<endl; // 输出标识符格式
}
}
}
int main()
{
string s;
while(cin>>s)//while(cin >> s)读取数据时以所有空白字符(包括空格、回车、制表符\t等)作为分隔符
{
int len=s.length();
string a="";//积累字符,用于输出
for(int i=0;i<len;i++)//遍历当前字符串的每个字符
{
// 情况1:当前字符是运算符(= + - * / < <= > >= == !=)
if(s[i]'='||s[i]'+'||s[i]'-'||s[i]'*'||s[i]'/'||s[i]'<'||s[i]'>'||s[i]'!')
{
if(a.length())// 若a中已有积累的字符(即运算符前有完整的词)
{
show(a);// 先处理a(判断类型并输出)
a="";// 清空a,准备处理下一个词
}
//检查是否为双字符运算符
if(i+1<len&&s[i+1]=='=')
{
cout<<"(operator,"<<s[i]<<s[i+1]<<")"<<endl; // 输出双字符运算符
i++; // 跳过下一个字符(避免重复处理)
}
else
{
cout<<"(operator,"<<s[i]<<")"<<endl; // 输出单字符运算符
}
}
// 情况2:当前字符是界符(括号、逗号、分号等语法分隔符)
else if(s[i]=='('||s[i]==')'||s[i]=='{'||s[i]=='}'||s[i]==','||s[i]==';')
{
if(a.length())// 若a中已有积累的字符(即运算符前有完整的词)
{
show(a);// 先处理a(判断类型并输出)
a="";// 清空a,准备处理下一个词
}
cout<<"(boundary,"<<s[i]<<")"<<endl; // 输出界符
}
// 情况3:整数integer、关键字keyword、自定义标识符identifier
else
{
a+=s[i]; // 将字符累加到a中,形成完整的词
}
}
// 循环结束后,若a中仍有未处理的字符(如字符串末尾的词)
if(a.length())
{
show(a); // 处理最后积累的词
}
}
return 0;
}

浙公网安备 33010602011771号