1 Star 0 Fork 0

盲大人/slang

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
token.c 15.20 KB
一键复制 编辑 原始数据 按行查看 历史
盲大人 提交于 2015-11-06 11:32 . 修复lexer中的bug
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#include <string.h>
#include "token.h"
static int id=0;
Token *createToken()
{
Token *token;
token=(Token*)calloc(sizeof(Token),1);
return token;
}
Token *createLabelToken(SourceLocation *location)
{
Token *token;
token=createToken();
token->type=TK_IDENTIFY;
token->location.line=location->line;
token->location.column=location->column;
token->text=(char*)malloc(sizeof(char)*32);
sprintf(token->text,"@auto%d",id);
id++;
return token;
}
void freeToken(Token *token)
{
if(token){
if(token->text)
free(token->text);
free(token);
}
}
Token *initToken(Token *token,TokenType type,SourceLocation *location,char *text)
{
assert(token);
assert(location);
token->type=type;
token->text=text;
token->location.line=location->line;
token->location.column=location->column;
return token;
}
Token *checkKeyToken(Token *token)
{
assert(token);
if(token->type==TK_IDENTIFY){
if((strcmp(token->text,"do")==0)){
token->type=TKKEY_DO;
free(token->text);
token->text=0;
}else if((strcmp(token->text,"if")==0)){
token->type=TKKEY_IF;
free(token->text);
token->text=0;
}else if((strcmp(token->text,"else")==0)){
token->type=TKKEY_ELSE;
free(token->text);
token->text=0;
}else if((strcmp(token->text,"while")==0)){
token->type=TKKEY_WHILE;
free(token->text);
token->text=0;
}else if((strcmp(token->text,"for")==0)){
token->type=TKKEY_FOR;
free(token->text);
token->text=0;
}else if((strcmp(token->text,"return")==0)){
token->type=TKKEY_RETURN;
free(token->text);
token->text=0;
}else if((strcmp(token->text,"break")==0)){
token->type=TKKEY_BREAK;
free(token->text);
token->text=0;
}else if((strcmp(token->text,"continue")==0)){
token->type=TKKEY_CONTINUE;
free(token->text);
token->text=0;
}else if(strcmp(token->text,"true")==0){
token->type=TKKEY_TRUE;
free(token->text);
token->text=0;
}else if(strcmp(token->text,"false")==0){
token->type=TKKEY_FALSE;
free(token->text);
token->text=0;
}else if(strcmp(token->text,"namespace")==0){
token->type=TKKEY_NAMESPACE;
free(token->text);
token->text=0;
}else if(strcmp(token->text,"import")==0){
token->type=TKKEY_IMPORT;
free(token->text);
token->text=0;
}else if(strcmp(token->text,"struct")==0){
token->type=TKKEY_STRUCT;
free(token->text);
token->text=0;
}else if(strcmp(token->text,"enum")==0){
token->type=TKKEY_ENUM;
free(token->text);
token->text=0;
}else if(strcmp(token->text,"interface")==0){
token->type=TKKEY_INTERFACE;
free(token->text);
token->text=0;
}else if(strcmp(token->text,"new")==0){
token->type=TKKEY_NEW;
free(token->text);
token->text=0;
}else if(strcmp(token->text,"delete")==0){
token->type=TKKEY_DELETE;
free(token->text);
token->text=0;
}else if(strcmp(token->text,"null")==0){
token->type=TKKEY_NULL;
free(token->text);
token->text=0;
}else if(strcmp(token->text,"void")==0){
token->type=TKKEY_VOID;
free(token->text);
token->text=0;
}else if(strcmp(token->text,"bool")==0){
token->type=TKKEY_BOOL;
free(token->text);
token->text=0;
}else if(strcmp(token->text,"char")==0){
token->type=TKKEY_CHAR;
free(token->text);
token->text=0;
}else if(strcmp(token->text,"uchar")==0){
token->type=TKKEY_UCHAR;
free(token->text);
token->text=0;
}else if(strcmp(token->text,"short")==0){
token->type=TKKEY_SHORT;
free(token->text);
token->text=0;
}else if(strcmp(token->text,"ushort")==0){
token->type=TKKEY_USHORT;
free(token->text);
token->text=0;
}else if(strcmp(token->text,"int")==0){
token->type=TKKEY_INT;
free(token->text);
token->text=0;
}else if(strcmp(token->text,"uint")==0){
token->type=TKKEY_UINT;
free(token->text);
token->text=0;
}else if(strcmp(token->text,"long")==0){
token->type=TKKEY_LONG;
free(token->text);
token->text=0;
}else if(strcmp(token->text,"ulong")==0){
token->type=TKKEY_ULONG;
free(token->text);
token->text=0;
}else if(strcmp(token->text,"float")==0){
token->type=TKKEY_FLOAT;
free(token->text);
token->text=0;
}else if(strcmp(token->text,"double")==0){
token->type=TKKEY_DOUBLE;
free(token->text);
token->text=0;
}
}
return token;
}
static void printTextToken(Token *token,char *text)
{
printf("%s\tline:%d\tcolumn:%d\t%s\n",text,token->location.line,token->location.column,token->text);
}
static void printPureToken(Token *token,char *text)
{
printf("%s:\tline:%d\tcolumn:%d\n",text,token->location.line,token->location.column);
}
void printToken(Token *token)
{
assert(token);
switch(token->type){
case TK_END:{
printf("TK_END\n");
break;
}
case TK_IDENTIFY:{
printTextToken(token,"TK_IDENTIFY");
break;
}
case TK_NUMBER:{
printTextToken(token,"TK_NUMBER");
break;
}
case TK_FLOAT:{
printTextToken(token,"TK_FLOAT");
break;
}
case TK_STRING:{
printTextToken(token,"TK_STRING");
break;
}
case TK_COMMENT:{
printTextToken(token,"TK_COMMENT");
break;
}
case TKOPT_INC:{
printPureToken(token,"TKOPT_INC");
break;
}
case TKOPT_DEC:{
printPureToken(token,"TKOPT_DEC");
break;
}
case TKOPT_ADD:{
printPureToken(token,"TKOPT_ADD");
break;
}
case TKOPT_SUB:{
printPureToken(token,"TKOPT_SUB");
break;
}
case TKOPT_MUL:{
printPureToken(token,"TKOPT_MUL");
break;
}
case TKOPT_DIV:{
printPureToken(token,"TKOPT_DIV");
break;
}
case TKOPT_MOD:{
printPureToken(token,"TKOPT_MOD");
break;
}
case TKOPT_ASSIGN:{
printPureToken(token,"TKOPT_ASSIGN");
break;
}
case TKOPT_ADDASSIGN:{
printPureToken(token,"TKOPT_ADDASSIGN");
break;
}
case TKOPT_SUBASSIGN:{
printPureToken(token,"TKOPT_SUBASSIGN");
break;
}
case TKOPT_MULASSIGN:{
printPureToken(token,"TKOPT_MULASSIGN");
break;
}
case TKOPT_DIVASSIGN:{
printPureToken(token,"TKOPT_DIVASSIGN");
break;
}
case TKOPT_MODASSIGN:{
printPureToken(token,"TKOPT_MODASSIGN");
break;
}
//bitopt
case TKOPT_BITAND:{
printPureToken(token,"TKOPT_BITAND");
break;
}
case TKOPT_BITOR:{
printPureToken(token,"TKOPT_BITOR");
break;
}
case TKOPT_BITXOR:{
printPureToken(token,"TKOPT_BITXOR");
break;
}
case TKOPT_BITNOT:{
printPureToken(token,"TKOPT_BITNOT");
break;
}
case TKOPT_BITANDASSIGN:{
printPureToken(token,"TKOPT_BITANDASSIGN");
break;
}
case TKOPT_BITORASSIGN:{
printPureToken(token,"TKOPT_BITORASSIGN");
break;
}
case TKOPT_BITXORASSIGN:{
printPureToken(token,"TKOPT_BITXORASSIGN");
break;
}
//bool
case TKOPT_AND:{
printPureToken(token,"TKOPT_AND");
break;
}
case TKOPT_OR:{
printPureToken(token,"TKOPT_OR");
break;
}
case TKOPT_NOT:{
printPureToken(token,"TKOPT_NOT");
break;
}
case TKOPT_ANDASSIGN:{
printPureToken(token,"TKOPT_ANDASSIGN");
break;
}
case TKOPT_ORASSIGN:{
printPureToken(token,"TKOPT_ORASSIGN");
break;
}
//bit shift
case TKOPT_SHIFTLEFT:{
printPureToken(token,"TKOPT_SHIFTLEFT");
break;
}
case TKOPT_SHIFTRIGHT:{
printPureToken(token,"TKOPT_SHIFTRIGHT");
break;
}
case TKOPT_SHIFTLEFTASSIGN:{
printPureToken(token,"TKOPT_SHIFTLEFTASSIGN");
break;
}
case TKOPT_SHIFTRIGHTASSIGN:{
printPureToken(token,"TKOPT_SHIFTRIGHTASSIGN");
break;
}
//area
case TKOPT_LEFTBLOCK:{
printPureToken(token,"TKOPT_LEFTBLOCK");
break;
}
case TKOPT_RIGHTBLOCK:{
printPureToken(token,"TKOPT_RIGHTBLOCK");
break;
}
case TKOPT_LEFTBRACKET:{
printPureToken(token,"TKOPT_LEFTBRACKET");
break;
}
case TKOPT_RIGHTBRACKET:{
printPureToken(token,"TKOPT_RIGHTBRACKET");
break;
}
case TKOPT_LEFTINDEX:{
printPureToken(token,"TKOPT_LEFTINDEX");
break;
}
case TKOPT_RIGHTINDEX:{
printPureToken(token,"TKOPT_RIGHTINDEX");
break;
}
//cmp
case TKOPT_MORE:{
printPureToken(token,"TKOPT_MORE");
break;
}
case TKOPT_MORETHAN:{
printPureToken(token,"TKOPT_MORETHAN");
break;
}
case TKOPT_LESS:{
printPureToken(token,"TKOPT_LESS");
break;
}
case TKOPT_LESSTHAN:{
printPureToken(token,"TKOPT_LESSTHAN");
break;
}
case TKOPT_EQUAL:{
printPureToken(token,"TKOPT_EQUAL");
break;
}
case TKOPT_NOTEQUAL:{
printPureToken(token,"TKOPT_NOTEQUAL");
break;
}
//specail
case TKOPT_TO:{
printPureToken(token,"TKOPT_TO");
break;
}
case TKOPT_AS:{
printPureToken(token,"TKOPT_AS");
break;
}
//grammar
case TKOPT_END:{
printPureToken(token,"TKOPT_END");
break;
}
case TKOPT_COMMA:{
printPureToken(token,"TKOPT_COMMA");
break;
}
case TKOPT_DOT:{
printPureToken(token,"TKOPT_DOT");
break;
}
//keyword
case TKKEY_DO:{
printPureToken(token,"TKKEY_DO");
break;
}
case TKKEY_IF:{
printPureToken(token,"TKKEY_IF");
break;
}
case TKKEY_ELSE:{
printPureToken(token,"TKKEY_ELSE");
break;
}
case TKKEY_WHILE:{
printPureToken(token,"TKKEY_WHILE");
break;
}
case TKKEY_FOR:{
printPureToken(token,"TKKEY_FOR");
break;
}
case TKKEY_RETURN:{
printPureToken(token,"TKKEY_RETURN");
break;
}
case TKKEY_BREAK:{
printPureToken(token,"TKKEY_BREAK");
break;
}
case TKKEY_CONTINUE:{
printPureToken(token,"TKKEY_CONTINUE");
break;
}
case TKKEY_TRUE:{
printPureToken(token,"TKKEY_TRUE");
break;
}
case TKKEY_FALSE:{
printPureToken(token,"TKKEY_FALSE");
break;
}
case TKKEY_NAMESPACE:{
printPureToken(token,"TKKEY_NAMESPACE");
break;
}
case TKKEY_IMPORT:{
printPureToken(token,"TKKEY_IMPORT");
break;
}
case TKKEY_STRUCT:{
printPureToken(token,"TKKEY_STRUCT");
break;
}
case TKKEY_ENUM:{
printPureToken(token,"TKKEY_ENUM");
break;
}
case TKKEY_INTERFACE:{
printPureToken(token,"TKKEY_INTERFACE");
break;
}
case TKKEY_NEW:{
printPureToken(token,"TKKEY_NEW");
break;
}
case TKKEY_DELETE:{
printPureToken(token,"TKKEY_DELETE");
break;
}
case TKKEY_NULL:{
printPureToken(token,"TKKEY_NULL");
break;
}
case TKKEY_VOID:{
printPureToken(token,"TKKEY_VOID");
break;
}
case TKKEY_BOOL:{
printPureToken(token,"TKKEY_BOOL");
break;
}
case TKKEY_CHAR:{
printPureToken(token,"TKKEY_CHAR");
break;
}
case TKKEY_UCHAR:{
printPureToken(token,"TKKEY_UCHAR");
break;
}
case TKKEY_SHORT:{
printPureToken(token,"TKKEY_SHORT");
break;
}
case TKKEY_USHORT:{
printPureToken(token,"TKKEY_USHORT");
break;
}
case TKKEY_INT:{
printPureToken(token,"TKKEY_INT");
break;
}
case TKKEY_UINT:{
printPureToken(token,"TKKEY_UINT");
break;
}
case TKKEY_LONG:{
printPureToken(token,"TKKEY_LONG");
break;
}
case TKKEY_ULONG:{
printPureToken(token,"TKKEY_ULONG");
break;
}
case TKKEY_FLOAT:{
printPureToken(token,"TKKEY_FLOAT");
break;
}
case TKKEY_DOUBLE:{
printPureToken(token,"TKKEY_DOUBLE");
break;
}
default:{
printf("TK_NONE:\tline:%d\tcolumn:%d\n",token->location.line,token->location.column);
}
}
}
Token *handleStringToken(Token *token)
{
assert(token);
if(token->text){
char *p;
int offset;
offset=0;
p=token->text;
while((*p)!='\0'){
if((*p)=='\\'){
offset++;
p++;
switch(*p){
case '0':{
*(p-offset)=0;
break;
}
case 'n':{
*(p-offset)='\n';
break;
}
case 'r':{
*(p-offset)='\r';
break;
}
case 't':{
*(p-offset)='\t';
break;
}
case 'a':{
*(p-offset)='\a';
}
case 'b':{
*(p-offset)='\b';
break;
}
case 'v':{
*(p-offset)='\v';
break;
}
case 'f':{
*(p-offset)='\f';
break;
}
default: *(p-offset)=*p;
}
}else{
if(offset>0){
*(p-offset)=*p;
}
}
p++;
}
}
return token;
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
C
1
https://gitee.com/xkaying/slang.git
[email protected]:xkaying/slang.git
xkaying
slang
slang
master

搜索帮助