三个关注,求hack
#include<iostream>
#include<cstring>
using namespace std;
char res[50][50]={"and","break","do","else","elseif","end","false",
"for","function","if","in","local","nil","not","or","repeat","return",
"then","true","until","while"};
char symbol[50][5]={"+","-","*","/","%","^","#","==",">=",
"<=",">","<","~=","(",")","{","}","[","]",";",":",",","...","..",".","="};
char s[1000005];
int n;
int is_res(int pos){
for(int i=0;i<21;++i){
int q=pos;
for(int j=0;res[i][j]!='\0';++j){
if(s[pos+j]!=res[i][j])goto R;
++q;
}
if(s[q]>='a'&&s[q]>='z'||s[q]>='A'&&s[q]<='Z')continue;
cout<<"[RESERVED] "<<res[i]<<'\n';
return q-1;
R:;
}
return 0;
}
int is_number(int pos){
if(!(s[pos]>='0'&&s[pos]<='9'||s[pos]=='.'))return 0;
if(s[pos]=='.'&&!(s[pos+1]>='0'&&s[pos+1]<='9'))return 0;
if(s[pos]=='0'&&(s[pos+1]=='x'||s[pos+1]=='X')){
for(int i=pos+2;;++i){
if(!(s[i]>='0'&&s[i]<='9'||s[i]>='a'&&s[i]<='f'||s[i]>='A'&&s[i]<='F')){
cout<<"[NUMBER] ";
for(int j=pos;j<i;++j){
cout<<s[j];
}
cout<<'\n';
return i-1;
}
}
}
else{
bool dot=0,e=0;
for(int i=pos;;++i){
if((s[i]=='+'||s[i]=='-')&&s[i-1]=='e')continue;
if((e&&s[i]=='e')||(dot&&s[i]=='.')||(s[i]!='.'&&s[i]!='e'&&!(s[i]>='0'&&s[i]<='9'))){
cout<<"[NUMBER] ";
for(int j=pos;j<i;++j)cout<<s[j];
cout<<'\n';
return i-1;
}
if(s[i]=='.')dot=1;
if(dot&&s[i]=='e')e=1;
}
cout<<"[NUMBER] ";
for(int i=pos;;++i){
if(!(s[i]>='0'&&s[i]<='9')){
cout<<'\n';
return i-1;
}
cout<<s[i];
}
}
}
int is_str(int pos){
if(s[pos]!='\"'&&s[pos]!='\'')return 0;
int i;
cout<<"[STRING] ";
cout<<s[pos];
for(i=pos+1;i<n&&s[i]!=s[pos];++i){
cout<<s[i];
if(s[i]=='\\')cout<<s[++i];
}
cout<<s[pos]<<'\n';
return i;
}
int is_symbol(int pos){
for(int i=0;i<26;++i){
int q=pos;
for(int j=0;symbol[i][j]!='\0';++j){
if(s[pos+j]!=symbol[i][j])goto R;
++q;
}
cout<<"[SYMBOL] "<<symbol[i]<<'\n';
return q-1;
R:;
}
return 0;
}
int is_name(int pos){
if(!(s[pos]>='a'&&s[pos]<='z'||s[pos]>='A'&&s[pos]<='Z'))return 0;
cout<<"[NAME] ";
for(int i=pos;i<=n;++i){
if(!(s[i]>='a'&&s[i]<='z'||s[i]>='A'&&s[i]<='Z'||
s[i]>='0'&&s[i]<='9'||s[i]=='_')){
cout<<'\n';
return i-1;
}
cout<<s[i];
}
}
int is_comment(int pos){
if(s[pos]!='-'||s[pos+1]!='-')return 0;
for(int i=pos;;++i){
if(s[i]=='\n')return i-1;
}
}
int main(){
while((s[++n]=getchar())!=EOF);
--n;
for(int i=1;i<=n;++i){
//cout<<i<<endl;
if(s[i]=='\n'||s[i]=='\r'){
cout<<"[EOL]\n";
continue;
}
if(s[i]==' ')continue;
int p=is_comment(i);
if(p)i=p;
else{
p=is_number(i);
if(p)i=p;
else{
p=is_str(i);
if(p)i=p;
else{
p=is_symbol(i);
if(p)i=p;
else{
p=is_res(i);
if(p)i=p;
else{
p=is_name(i);
i=p;
}
}
}
}
}
}
return 0;
}