#include <iostream>
#include<string>
#include <stdio.h>
using namespace std;
const string KeyWord[12] = { "main","int","char","if","else","for","while","return","void","STRING","ID","INT" };
// There are many things you can add to this, this is just a simple simulation
int syn;
string jibo;
int sum;
int i = 0;
int skip = 1;
bool IsLetter(char ch);
bool IsDigit(char ch);
void scan(string s);
int main()
{
string a = "";
printf("\n Please enter a string (the conversion is over, the conversion is not recognized) :");
getline(cin, a);
printf("\nOutput (type, letter or number) :\n");
do
{
scan(a);
switch (syn)
{
case -1:
printf("error:There is no end character or invalid characters");
syn = 0;
break;
case -2: // Spaces are skipped
break;
default:
if (syn != 0)
{
if (1<= syn && 22 >= syn)//1 to 22 delimiters, 23 numbers,24 identifiers,25 keywords,26 to 31 operators
{
cout << "(分界符," << jibo << ")" << endl;
}
else if (syn == 23)
{
cout << "(字面量," << sum << ")" << endl;
}
else if (syn == 24)
{
cout << "(标识符," << jibo << ")" << endl;
}
else if (syn == 25)
{
cout << "(关键字," << jibo << ")" << endl;
}
}
}
} while (syn != 0);
}
bool IsLetter(char ch) //Whether it is a letter
{
if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z'))
return true;
else
return false;
}
bool IsDigit(char ch) //Whether it is a number
{
if (ch >= '0' && ch <= '9')
return true;
else
return false;
}
void scan(string a)
{
if (a[i] == ' ')//space
{
syn = -2;
i++;
}
else
{
jibo = "";
if (IsDigit(a[i]))//number
{
jibo = "";
sum = 0;
while (IsDigit(a[i])) {
sum = sum * 10 + (a[i] - '0');
i++;
syn = 23;
}
}
else if (IsLetter(a[i]))//string
{
jibo = "";
while (IsDigit(a[i]) || IsLetter(a[i])) {
jibo += a[i];
i++;
}
syn = 24;
for (int j = 0; j < 12; j++)//keywords
{
if (jibo == KeyWord[j])
{
syn = 25;
break;
}
}
}
// Judge as sign
else { //operator
jibo = "";
switch (a[i]) {
case'=':
syn = 30;
i++;
jibo = "=";
if (a[i] == '=') {
syn = 6;
i++;
jibo = "==";
}
break;
case'+':syn = 29;
i++;
jibo = "+";
break;
case'-':
syn = 28;
i++;
jibo = "-";
break;
case'*':
syn = 27;
i++;
jibo = "*";
break;
case'/':
syn = 26;
i++;
jibo = "/";
break;
case'%':
syn = 31;
i++;
jibo = "%";
break;
case'&':
syn = 32;
i++;
jibo = "&";
break;
case'(':
syn = 11;
i++;
jibo = "(";
break;
case')':
syn = 12;
i++;
jibo = ")";
break;
case'[':
syn = 13;
i++;
jibo = "[";
break;
case']':
syn = 14;
i++;
jibo = "]";
break;
case'{':
syn = 15;
i++;
jibo = "{";
break;
case'}':
syn = 16;
i++;
jibo = "}";
break;
case',':
syn = 17;
i++;
jibo = ",";
break;
case':':
syn = 18;
i++;
jibo = ":";
break;
case';':
syn = 19;
i++;
jibo = ";";
break;
case'>':
syn = 20;
i++;
jibo = ">";
if (a[i] == '=')
{
i++;
jibo = ">=";
}
break;
case'<':
syn = 21;
i++;
jibo = "<";
if (a[i] == '=')
{
i++;
jibo = "<=";
}
break;
case'!':
syn = 22;
i++;
if (a[i] == '=')
{
syn = 1;
i++;
jibo = "!=";
}
break;
case '"':
syn = 2;
jibo += a[i];
i++;
break;
case '#':
syn=3;
jibo='#';
i++;
break;
default:
syn = -1;
break;
}
}
}
}