< 参考代码 >
#include "iostream"
using namespace std;
// 定义6个关键词
string S[6] = {"main", "for", "if", "else", "int", "while"};
// Todo: 设置display 函数用于输出关键词、整数、自定义字符
void display(string s){
//如果传入的字串第一个字符是数字,那肯定剩下的全部是数字,所以判断头一个即可
if(s[0] >= '0' && s[0] <= '9')
cout<<"(integer,"<<s<<")"<<endl;
else{
// 定义一个flag参数用于判断是否找到关键字
int flag = 1;
for(int i = 0; i < 6; i++){
// 找到关键字并输出,记得将flag变为0
if(s == S[i]){
flag = 0;
cout<<"(keyword,"<<s<<")"<<endl;
}
}
//如果既不是数字又不是关键字,那么肯定是自定义字符
if(flag == 1)
cout<<"(identifier,"<<s<<")"<<endl;
}
}
//要知道display函数是在判断完不是界符和标识符的基础上判断剩下的三种符号的。
// Todo: 主函数
int main(){
string s;
while(cin>>s){
// 调用length函数保存输入字符长度
int len = s.length();
// 定义字串a并初始化为空字符
string a = "";
for(int i = 0; i < len; i++){
if(s[i] == '=' || s[i] == '+' || s[i] == '-' || s[i] == '*' || s[i] == '/' || s[i] == '<' || s[i] == '>' || s[i] == '!'){
// 如果a不为空,则进入display函数进行判断是那种词法
if(a.length())
display(a);
a = "";
// 此处是判断>= <= !=的情况
if(i + 1 < len && s[i + 1] == '='){
cout<<"(operator,"<<s[i]<<s[i + 1]<<")"<<endl;
i++; // 记得将i+1,不然下次循环会重复判断
}
else
cout<<"(operator,"<<s[i]<<")"<<endl;
}
else if(s[i] == '(' || s[i] == ')' || s[i] == '{' || s[i] == '}' || s[i] == ',' || s[i] == ';'){
if(a.length())
display(a);//同上
a = "";
cout<<"(boundary,"<<s[i]<<")"<<endl;
}
else
a = a + s[i];
}
// 此处是为了避免a中还存留输入的字符没进行判断,所以最后再调用一次display函数进行清空操作
if(a.length())
display(a);
}
return 0;
}
< 代码思路 >
int main()
void display( string s)
< 参考代码 >
#include
#include
#include
int i=0,c=0;
char s[65];
void E();
void T();
void G();
void S();
void F();
void E(){
if(s[i]=='('||s[i]=='i'){
printf("%d E-->TG\n",c++);
T();
G();
} else{
printf("error\n");
exit(0);
}
}
void T(){
if(s[i]=='('||s[i]=='i'){
printf("%d T-->FS\n",c++);
F();
S();
} else{
printf("error\n");
exit(0);
}
}
void G(){
if(s[i]=='+'){
printf("%d G-->+TG\n",c++);
i++;
T();
G();
} else
printf("%d G-->&\n",c++);
}
void S(){
if(s[i]=='*'){
printf("%d S-->*FS\n",c++);
i++;
F();
S();
} else
printf("%d S-->&\n",c++);
}
void F(){
if(s[i]=='i'){
printf("%d F-->i\n",c++);
i++;
}
else if(s[i]=='('){
printf("%d F-->(E)\n",c++);
i++;
E();
if(s[i]==')')
i++;
else{
printf("error\n");
exit(0);
}
} else{
printf("error\n");
exit(0);
}
}
int main(){
scanf("%s",s);
E();
if(s[i]!='#')
printf("error\n");
else
printf("accept\n");
return 0;
}
< 代码思路 >