2 Star 8 Fork 1

小鱼干 / RainbowLexer

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
RainbowLexerFront 19.49 KB
一键复制 编辑 原始数据 按行查看 历史
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682
long long RainbowFrontStatusCheekOfStaticWordValiditySp(const char *token);
long long RainbowFrontStatusCheekOfStaticWordValidity(const char *token)
{
switch (*token++)
{
case 'I':
{
switch (*token++)
{
case 'G':
{
switch (*token++)
{
case 'N':
{
switch (*token++)
{
case 'O':
{
switch (*token++)
{
case 'R':
{
return 3;
break;
}
default:
{
return -1;
break;
}
}
}
default:
{
return -1;
break;
}
}
}
default:
{
return -1;
break;
}
}
}
default:
{
return -1;
break;
}
}
}
case 'N':
{
switch (*token++)
{
case 'U':
{
switch (*token++)
{
case 'M':
{
switch (*token++)
{
case 'B':
{
switch (*token++)
{
case 'E':
{
return 14;
break;
}
default:
{
return -1;
break;
}
}
}
default:
{
return -1;
break;
}
}
}
default:
{
return -1;
break;
}
}
}
default:
{
return -1;
break;
}
}
}
case 'S':
{
switch (*token++)
{
case 'T':
{
switch (*token++)
{
case 'R':
{
switch (*token++)
{
case 'I':
{
switch (*token++)
{
case 'N':
{
switch (*token++)
{
case 'G':
{
switch (*token++)
{
case '_':
{
switch (*token++)
{
case 'S':
{
switch (*token++)
{
case 'I':
{
switch (*token++)
{
case 'N':
{
switch (*token++)
{
case 'G':
{
switch (*token++)
{
case 'L':
{
return 12;
break;
}
default:
{
return -1;
break;
}
}
}
default:
{
return -1;
break;
}
}
}
default:
{
return -1;
break;
}
}
}
default:
{
return -1;
break;
}
}
}
case 'D':
{
switch (*token++)
{
case 'O':
{
switch (*token++)
{
case 'U':
{
switch (*token++)
{
case 'B':
{
switch (*token++)
{
case 'L':
{
return 13;
break;
}
default:
{
return -1;
break;
}
}
}
default:
{
return -1;
break;
}
}
}
default:
{
return -1;
break;
}
}
}
default:
{
return -1;
break;
}
}
}
default:
{
return -1;
break;
}
}
}
default:
{
return -1;
break;
}
}
}
default:
{
return -1;
break;
}
}
}
default:
{
return -1;
break;
}
}
}
default:
{
return -1;
break;
}
}
}
default:
{
return -1;
break;
}
}
}
default:
{
return -1;
break;
}
}
}
case '_':
{
switch (*token++)
{
case '_':
{
switch (*token++)
{
case 'V':
{
switch (*token++)
{
case 'A':
{
switch (*token++)
{
case 'R':
{
switch (*token++)
{
case '_':
{
return 11;
break;
}
default:
{
return -1;
break;
}
}
}
default:
{
return -1;
break;
}
}
}
default:
{
return -1;
break;
}
}
}
default:
{
return -1;
break;
}
}
}
default:
{
return -1;
break;
}
}
}
case 's':
{
switch (*token++)
{
case 't':
{
switch (*token++)
{
case 'a':
{
switch (*token++)
{
case 't':
{
switch (*token++)
{
case 'i':
{
switch (*token++)
{
case 'c':
{
switch (*token++)
{
case 'W':
{
switch (*token++)
{
case 'o':
{
switch (*token++)
{
case 'r':
{
return 1;
break;
}
default:
{
return -1;
break;
}
}
}
default:
{
return -1;
break;
}
}
}
default:
{
return -1;
break;
}
}
}
default:
{
return -1;
break;
}
}
}
default:
{
return -1;
break;
}
}
}
default:
{
return -1;
break;
}
}
}
default:
{
return -1;
break;
}
}
}
case 'w':
{
return 1;
break;
}
case 'p':
{
switch (*token++)
{
case 'e':
{
switch (*token++)
{
case 'r':
{
switch (*token++)
{
case 'a':
{
switch (*token++)
{
case 't':
{
switch (*token++)
{
case 'o':
{
return 2;
break;
}
default:
{
return -1;
break;
}
}
}
default:
{
return -1;
break;
}
}
}
default:
{
return -1;
break;
}
}
}
default:
{
return -1;
break;
}
}
}
default:
{
return RainbowFrontStatusCheekOfStaticWordValiditySp(token) == -1 ? 2 : -1;
break;
}
}
}
default:
{
return -1;
break;
}
}
}
default:
return -1;
break;
}
}
long long RainbowFrontStatusCheekOfStaticWordValiditySp(const char *token)
{
switch (*token++)
{
case '\t':
{
return 2147473648;
break;
}
case '\n':
{
return 2147473647;
break;
}
case ' ':
{
return 2147473649;
break;
}
case ',':
{
return 20;
break;
}
case ';':
{
return 22;
break;
}
case '-':
{
return 19;
break;
}
case ':':
{
return 21;
break;
}
case '[':
{
return 17;
break;
}
case ']':
{
return 18;
break;
}
case '{':
{
return 15;
break;
}
case '}':
{
return 16;
break;
}
default:
return -1;
break;
}
}
int RainbowFrontStatuSperatorMatch(const char *token)
{
int id = RainbowFrontStatusCheekOfStaticWordValiditySp(token);
switch (id)
{
case 2147473647:
case 2147473648:
case 2147473649:
case 21:
case 20:
case 19:
case 18:
case 17:
case 15:
case 16:
case 22:
return 0;
break;
default:
{
return -1;
break;
}
}
}
void RainbowFrontLex(const char* string,long long* id_list)
{
/* 将string解析
并加入到ret列表中
*/
const char* strptr = string;
WHITESPACE_SKIP(strptr);
char buf[BUF_SIZE] = {'\0'};
size_t index = 0;
while(*strptr != '\0')
{
if(*strptr == '\"')//处理字符串
{
if(*buf!='\0')
{
long long id = 0;
id = RainbowFrontStatusCheekOfStaticWordValidity(buf);
if(id >= 0) RainbowRetAdd(buf,id,&RainbowFrontLexer_Ret);
else if(isalpha(*buf)&&(RainbowStatusCheekVarNameValidity(buf) != -1)&& (RainBowLexer_id_var!=-1))
RainbowRetAdd(buf,RainBowLexer_id_var,&RainbowFrontLexer_Ret);
else if(isdigit(*buf)&&(RainbowStatusCheekNumValidity(buf) != -1)&& (RainBowLexer_id_num!=-1))
RainbowRetAdd(buf,RainBowLexer_id_num,&RainbowFrontLexer_Ret);
else//错误处理
{
RAINBOW_RAISE(UndefineToken);
printf("%s\n",buf);
getchar();
putchar('\n');
}
}
char* stringToken = RainbowStatusCheekOfString(strptr+1,'\"');
if(stringToken == NULL)return;
int len = strlen(stringToken);
strptr+=len+2;
RainbowRetAdd(stringToken,RainBowLexer_id_string,&RainbowFrontLexer_Ret);
free(stringToken);
continue;
}
int spRet = RainbowFrontStatuSperatorMatch(strptr);
if(*buf == '\0' && spRet >= 0) goto BUF_EMPTY_CASE_;//处理第一个字符是分隔符的情况
if(spRet >= 0)
{
int id = 0;
id = RainbowFrontStatusCheekOfStaticWordValidity(buf);
if(id >= 0) RainbowRetAdd(buf,id,&RainbowFrontLexer_Ret);
else if(*buf != '\0' && isalpha(*buf)&&(RainbowStatusCheekVarNameValidity(buf) != -1)&&RainBowLexer_id_var!=-1)
RainbowRetAdd(buf,RainBowLexer_id_var,&RainbowFrontLexer_Ret);
else if(*buf != '\0' && isdigit(*buf)&&(RainbowStatusCheekNumValidity(buf) != -1)&&RainBowLexer_id_num!=-1)
RainbowRetAdd(buf,RainBowLexer_id_num,&RainbowFrontLexer_Ret);
else if(*buf == '\0')goto BUF_EMPTY_CASE_;//用于处理多个连续分隔符的情况
else//错误处理
{
RAINBOW_RAISE(UndefineToken);
printf("%s\n",buf);
getchar();
putchar('\n');
}
BUF_EMPTY_CASE_:
memset(buf,'\0',BUF_SIZE);
index = 0;
for (size_t i = 0; i <= spRet; i++)buf[i] = *strptr++;
RainbowRetAdd(buf,RainbowFrontStatusCheekOfStaticWordValiditySp(buf),&RainbowFrontLexer_Ret);
memset(buf,'\0',BUF_SIZE);
}
else
buf[index++] = *strptr++;
}
if(*buf == '\0')return;//buf已空 情况出现在最后一个字符是分隔符时
//清理buf
long long id = 0;
id = RainbowFrontStatusCheekOfStaticWordValidity(buf);
if(id >= 0) RainbowRetAdd(buf,id,&RainbowFrontLexer_Ret);
else if(*buf != '\0' && isalpha(*buf)&&(RainbowStatusCheekVarNameValidity(buf) != -1)&&RainBowLexer_id_var!=-1)
RainbowRetAdd(buf,RainBowLexer_id_var,&RainbowFrontLexer_Ret);
else if(*buf != '\0' && isdigit(*buf)&&(RainbowStatusCheekNumValidity(buf) != -1)&&RainBowLexer_id_num!=-1)
RainbowRetAdd(buf,RainBowLexer_id_num,&RainbowFrontLexer_Ret);
else//错误处理
{
RAINBOW_RAISE(UndefineToken);
printf("%s\n",buf);
getchar();
putchar('\n');
}
return;
}
C
1
https://gitee.com/bupt_xyg/RainbowLexer.git
git@gitee.com:bupt_xyg/RainbowLexer.git
bupt_xyg
RainbowLexer
RainbowLexer
master

搜索帮助