小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;

}

posted @ 2025-11-18 08:43  W001hhhFA  阅读(0)  评论(0)    收藏  举报