题目简介

SDUTACM小C语言--词法分析程序_标识符

题目思路

首题目给的条件是:

  • 关键字:main if else for while int
  • 自定义标识符:除关键字外的标识符
  • 整数:无符号整数
  • 界符:{ } ( ) , ;
  • 运算符:= + - * / < <= > >= == !=

当出现这些符号时,需要进行判断,来获取输出,输出的格式如以下所示:

  • 关键字:用keyword表示
  • 自定义标识符:用identifier表示
  • 整数:用integer表示
  • 界符:用boundary表示
  • 运算符:用operator表示

主程序中用一个temp字符串来存储非运算符、界符之外的字符。
以样例为例:
当跑main时,他会把main储存到temp字符串数组中,当跑到(时,他会判断temp中的字符,来判断其是不是关键字,如果是的话,进行输出,不是的话,输出其为自定义标识符。其他的也同理,最后判断输出temp。

注意注意

  1. 第一个错的地方,容易出现在判断 <= 这类,忘记i++
  2. 第二个错误的地方,容易出现在输出上面,经常性的会漏掉输出中个某个逗号或者其他的

代码

/*

author:苦酒
QQ:1793929520
blog:huangliangshuai.com

*/

#include <iostream>
#include <string>

using namespace std;

string kind[5] = {"keyword","identifier","integer","boundary","operator"};
string keyword[6] = {"main","if","else","for","while","int"};
void decide(string s)
{
    if(s[0] >= '0' && s[0] <= '9')//如果当前判断的第一个字符为数字的话,直接输出
    {
        cout<<"("<<kind[2]<<","<<s<<")"<<endl;
    }
    else
    {
        int f = 0;//此处作为标记
        for(int i = 0; i < 6; i++)
        {
            if(s == keyword[i])//如果当前temp存储的字符串与关键字里面的字符串相等,则改变标记的数值,并且输出关键字,终止循环,节省时间
            {
                f = 1;
                cout<<"("<<kind[0]<<","<<s<<")"<<endl;
                break;
            }
        }
        if(f == 0)//如果找不到关键字的话,则认为这是一个自定义标识符,进行输出
        {
            cout<<"("<<kind[1]<<","<<s<<")"<<endl;
        }
    }
}
int main()
{
    string s;
    while(cin>>s)
    {
        string temp;
        temp = "";
        int len = s.length();
        for(int i = 0; i < len; i++)
        {
            if(s[i] == '=' || s[i] == '+' || s[i] == '-' || s[i] == '*' || s[i] == '/' || s[i] == '<' || s[i] == '>' || s[i] == '!')//判断输入的是不是运算符
            {
                if(temp.length())
                {
                    decide(temp);
                }
                temp = "";
                if(i + 1 < len && s[i + 1] == '=')//判断输入的是不是<= >= == ,是的话就进行输出、
                {
                    cout<<"("<<kind[4]<<","<<s[i]<<s[i+1]<<")"<<endl;
                    i++;
                }
                else
                {
                    cout<<"("<<kind[4]<<","<<s[i]<<")"<<endl;//反之就输出单字符的运算符
                }
            }
            else if(s[i] == '(' || s[i] == ')' || s[i] == '{' || s[i] == '}' || s[i] == ',' || s[i] == ';')//判断当前是不是界符
            {
                if(temp.length())
                {
                    decide(temp);
                }
                temp = "";
                cout<<"("<<kind[3]<<","<<s[i]<<")"<<endl;
            }
            else
            {
                temp = temp + s[i];//将全部不是的存储到temp里面
            }
        }
        if(temp.length())
        {
            decide(temp);
        }
    }
    return 0;
}


/***************************************************
User name: jk170631黄良帅
Result: Accepted
Take time: 0ms
Take Memory: 196KB
Submit time: 2019-11-18 21:33:32
****************************************************/