- 论坛徽章:
- 0
|
比比这个:- int _get_tok(token_type *t){
- int n=0,next_char,l;
- int dot=0,num=0;
- char *s;
-
- t->blank=blank();
- if(blank_request){
- blank_request=0;
- t->blank=1;
- }
- t->line_no=n_line;
-
- if(cur_char==LEX_EOF){
- t->type=LEX_EOF;
- return t->type;
- }
- if(cur_char==LEX_EOS){
- t->type=LEX_EOS;
- return t->type;
- }
- if(cur_char=='#' && get_char==_get_char){
- t->text[n++]=cur_char;
- for(cur_char=get_char();cur_char!=LEX_EOF;){
- if(cur_char=='\\'){
- next_char=get_char();
- //if(n<BUFFER_SIZE-1)t->text[n++]=cur_char;
- for(;next_char==' ' ||next_char=='\t';next_char=get_char());
- while(next_char=='\r'||next_char=='\n')
- next_char=get_char();
- cur_char=next_char;
- for(;n>0 && (t->text[n-1]=='\t'||t->text[n-1]==' ');n--);
- if(n<BUFFER_SIZE-1)t->text[n++]='\n';
- }else{
- if(cur_char=='\r' ||cur_char=='\n')
- break;
- if(cur_char=='\t')
- cur_char=' ';
- if(n<BUFFER_SIZE-1)t->text[n++]=cur_char;
- cur_char=get_char();
- }
- }
- t->text[n++]=0;
- t->type=LEX_PREPROCESS;
- cur_char=get_char();
- return t->type;
- }
- if(cur_char=='/' && get_char==_get_char){
- next_char=get_char();
- if(next_char=='/'){
- for(cur_char=get_char();cur_char!=LEX_EOF;cur_char=get_char()){
- if(n<BUFFER_SIZE-1)t->text[n++]=cur_char;
- if(cur_char=='\r' ||cur_char=='\n')
- break;
- }
- t->text[n++]=0;
- t->type=LEX_COMMENT;
- cur_char=get_char();
- }else if(next_char=='*'){
- cur_char=get_char();
- next_char=get_char();
- for(;next_char!=LEX_EOF;cur_char=next_char,next_char=get_char()){
- if(cur_char=='*' && next_char=='/'){
- next_char=get_char();
- break;
- }
- if(n<BUFFER_SIZE-1)t->text[n++]=cur_char;
- }
- t->text[n++]=0;
- t->type=LEX_COMMENT;
- cur_char=next_char;
- }else{
- t->type=t->text[n++]=cur_char;
- t->text[n++]=0;
- cur_char=next_char;
- }
- return t->type;
- }
- if(cur_char=='_'||isalpha(cur_char)){
- do{
- if(n<BUFFER_SIZE-1)
- t->text[n++]=cur_char;
- cur_char=get_char();
- }while(cur_char=='_'||isalpha(cur_char)||isdigit(cur_char));
- t->text[n++]=0;
- t->type=LEX_NAME;
- s=t->text;
- if(!strcmp(t->text,"namespace")){
- t->type =LEX_NAMESPACE;
- return 0;
- }else if(!strcmp(t->text,"class")){
- t->type =LEX_CLASS;
- return 0;
- }else if( !strcmp(t->text,"union") ||!strcmp(t->text,"struct")){
- t->type =LEX_STRUCT;
- }else if(!strcmp(t->text,"extern")){
- blank();
- if(cur_char=='\"'){
- do{
- t->text[n++]=get_char();
- }while(cur_char!='\"' && cur_char!= LEX_EOF );
- t->type =LEX_EXTERN_C;
- // t->text[n++]=' ';
- t->text[n++]=0;
- }else{
- blank_request=1;
- }
- }
- return t->type;
- }
- if(cur_char=='.'||isdigit(cur_char)){
- next_char=get_char();
- if(cur_char=='0' && (next_char=='X' || next_char=='x')){
- t->text[n++]=cur_char;
- t->text[n++]=next_char;
- cur_char=get_char();
- while(is_hex(cur_char)){
- if(n<BUFFER_SIZE-1) t->text[n++]=cur_char;
- cur_char=get_char();
- }
- t->text[n++]=0;
- t->val=t->uval=hex_atou(t->text);
- return t->type=LEX_INT;
-
- }else{
- if(cur_char=='.')
- dot=1;
- else
- num=1;
- if(n<BUFFER_SIZE-1) t->text[n++]=cur_char;
- cur_char=next_char;
- do{
- if(dot && cur_char=='.'){
- strcpy(t->text,"error");
- return t->type=LEX_ERROR;
- }
- if(!(cur_char=='.'||isdigit(cur_char)))
- break;
- if(cur_char=='.')
- dot=1;
- else
- num=1;
- t->text[n++]=cur_char;
- cur_char=get_char();
- }while(1);
- if((cur_char=='e'||cur_char=='E') && num){
- dot=1;
- if(n<BUFFER_SIZE-1) t->text[n++]=cur_char;
- cur_char=get_char();
- if(cur_char=='+'||cur_char=='-'){
- if(n<BUFFER_SIZE-1) t->text[n++]=cur_char;
- cur_char=get_char();
- }
- if(isdigit(cur_char)){
- do{
- if(n<BUFFER_SIZE-1) t->text[n++]=cur_char;
- cur_char=get_char();
- }while(isdigit(cur_char)) ;
- }else{
- strcpy(t->text,"error");
- return t->type=LEX_ERROR;
- }
- }
- if(dot){
- t->type=LEX_FLOAT;
- if(cur_char=='d' || cur_char=='D' || cur_char=='f' || cur_char=='F'){
- if(n<BUFFER_SIZE-1) t->text[n++]=cur_char;
- cur_char=get_char();
- }
- }else{
- t->type=LEX_INT;
- if(cur_char=='L' || cur_char=='l'){
- if(n<BUFFER_SIZE-1) t->text[n++]=cur_char;
- cur_char=get_char();
- }else if(cur_char=='d' || cur_char=='D' || cur_char=='f' || cur_char=='F'){
- t->type=LEX_FLOAT;
- if(n<BUFFER_SIZE-1) t->text[n++]=cur_char;
- cur_char=get_char();
- }
- }
- }
- if(t->type==LEX_FLOAT){
- t->dval=atof(t->text);
- }else{
- t->val=t->uval=atol(t->text);
- }
- t->text[n++]=0;
- return t->type;
- }
- if(cur_char=='"'){
- cur_char=get_char();
- for(;cur_char!='"' && cur_char!=EOF;){
- if(cur_char=='\\'){
- if(n<BUFFER_SIZE-1) t->text[n++]=cur_char;
- cur_char=get_char();
- }
-
- if(cur_char=='\r' || cur_char=='\n')
- while(cur_char=='\r' || cur_char=='\n')
- cur_char=get_char();
- else if(cur_char!=EOF){
- if(n<BUFFER_SIZE-1){
- t->text[n++]=cur_char;
- cur_char=get_char();
- }
- }
- }
- t->text[n++]=0;
- if(cur_char!='"'){
- t->type=LEX_ERROR;
- sprintf(t->text,"\" missing.");
- cur_char=get_char();
- return t->type;
- }
- cur_char=get_char();
- t->type=LEX_STRING;
- return t->type;
- }
- if(cur_char=='\''){
- cur_char=get_char();
- if(cur_char=='\\'){
- t->text[n++]=cur_char;
- cur_char=get_char();
- t->text[n++]=cur_char;
- cur_char=get_char();
- }
- while(cur_char!='\'' && cur_char!=LEX_EOF){
- if(n<BUFFER_SIZE-1)t->text[n++]=cur_char;
- cur_char=get_char();
- }
- if(cur_char!='\''){
- strcpy(t->text,"missing \'");
- t->type=LEX_ERROR;
- }
- t->text[n++]=0;
- cur_char=get_char();
- t->type=LEX_QUOTE;
-
- return t->type;
- }else if(cur_char==':'){
- next_char=get_char();
- if(next_char==':'){
- t->text[n++]=cur_char;
- cur_char=next_char;
- next_char=get_char();
- t->type=LEX_DOUBLEKOLON;
- }else{
- t->type=cur_char;
- }
- t->text[n++]=cur_char;
- t->text[n++]=0;
- cur_char=next_char;
- }else{
- t->text[n++]=cur_char;
- t->text[n++]=0;
- t->type=cur_char;
- cur_char=get_char();
- }
- return t->type;
- }
复制代码 |
|