免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: image_z
打印 上一主题 下一主题

[C] [code review了]一个函数,看了眼,吓坏了。 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2013-06-06 09:48 |只看该作者
词法分析本来就很麻烦,所有要用lex/flex这些工具自动生成啊。

next_token功能没有写得好看的,不管是手写还是自动生成。

论坛徽章:
0
12 [报告]
发表于 2013-06-06 11:06 |只看该作者
回复 11# sonicling


    嗯。

论坛徽章:
0
13 [报告]
发表于 2013-06-06 11:37 |只看该作者
比比这个:
  1. int        _get_tok(token_type        *t){
  2.         int        n=0,next_char,l;
  3.         int        dot=0,num=0;
  4.         char        *s;
  5.        
  6.         t->blank=blank();
  7.         if(blank_request){
  8.                 blank_request=0;
  9.         t->blank=1;
  10. }
  11.         t->line_no=n_line;
  12.        
  13.         if(cur_char==LEX_EOF){
  14.                 t->type=LEX_EOF;
  15.                 return t->type;
  16.         }
  17.         if(cur_char==LEX_EOS){
  18.                 t->type=LEX_EOS;
  19.                 return t->type;
  20.         }
  21.         if(cur_char=='#' && get_char==_get_char){
  22.                 t->text[n++]=cur_char;
  23.                 for(cur_char=get_char();cur_char!=LEX_EOF;){
  24.                         if(cur_char=='\\'){
  25.                                 next_char=get_char();
  26.                         //if(n<BUFFER_SIZE-1)t->text[n++]=cur_char;
  27.                                 for(;next_char==' ' ||next_char=='\t';next_char=get_char());
  28.                                 while(next_char=='\r'||next_char=='\n')
  29.                                         next_char=get_char();
  30.                                 cur_char=next_char;
  31.                                 for(;n>0 && (t->text[n-1]=='\t'||t->text[n-1]==' ');n--);
  32.                                 if(n<BUFFER_SIZE-1)t->text[n++]='\n';
  33.                         }else{
  34.                                 if(cur_char=='\r' ||cur_char=='\n')
  35.                                         break;
  36.                                 if(cur_char=='\t')
  37.                                         cur_char=' ';
  38.                                 if(n<BUFFER_SIZE-1)t->text[n++]=cur_char;
  39.                                 cur_char=get_char();
  40.                         }
  41.                 }
  42.                 t->text[n++]=0;
  43.                 t->type=LEX_PREPROCESS;
  44.                 cur_char=get_char();
  45.                 return        t->type;
  46.         }
  47.         if(cur_char=='/' && get_char==_get_char){
  48.                 next_char=get_char();
  49.                 if(next_char=='/'){
  50.                         for(cur_char=get_char();cur_char!=LEX_EOF;cur_char=get_char()){
  51.                                 if(n<BUFFER_SIZE-1)t->text[n++]=cur_char;
  52.                                 if(cur_char=='\r' ||cur_char=='\n')
  53.                                         break;
  54.                         }
  55.                         t->text[n++]=0;
  56.                         t->type=LEX_COMMENT;
  57.                         cur_char=get_char();
  58.                 }else if(next_char=='*'){
  59.                         cur_char=get_char();
  60.                         next_char=get_char();
  61.                         for(;next_char!=LEX_EOF;cur_char=next_char,next_char=get_char()){
  62.                                 if(cur_char=='*' && next_char=='/'){
  63.                                         next_char=get_char();
  64.                                         break;
  65.                                 }
  66.                                 if(n<BUFFER_SIZE-1)t->text[n++]=cur_char;
  67.                         }
  68.                         t->text[n++]=0;
  69.                         t->type=LEX_COMMENT;
  70.                         cur_char=next_char;
  71.                 }else{
  72.                         t->type=t->text[n++]=cur_char;
  73.                         t->text[n++]=0;
  74.                         cur_char=next_char;
  75.                 }
  76.                 return        t->type;
  77.         }
  78.         if(cur_char=='_'||isalpha(cur_char)){
  79.                 do{
  80.                         if(n<BUFFER_SIZE-1)
  81.                                 t->text[n++]=cur_char;
  82.                         cur_char=get_char();
  83.                 }while(cur_char=='_'||isalpha(cur_char)||isdigit(cur_char));
  84.                 t->text[n++]=0;
  85.                 t->type=LEX_NAME;
  86.                 s=t->text;
  87.                  if(!strcmp(t->text,"namespace")){
  88.                         t->type  =LEX_NAMESPACE;
  89.                         return 0;
  90.                 }else if(!strcmp(t->text,"class")){
  91.                         t->type  =LEX_CLASS;
  92.                         return 0;
  93.                 }else if( !strcmp(t->text,"union") ||!strcmp(t->text,"struct")){
  94.                         t->type  =LEX_STRUCT;
  95.                 }else if(!strcmp(t->text,"extern")){
  96.                         blank();
  97.                         if(cur_char=='\"'){
  98.                                 do{
  99.                                         t->text[n++]=get_char();
  100.                                 }while(cur_char!='\"' && cur_char!= LEX_EOF );
  101.                         t->type  =LEX_EXTERN_C;
  102. //                        t->text[n++]=' ';
  103.                         t->text[n++]=0;
  104.                         }else{
  105.                                 blank_request=1;
  106.                         }
  107.                 }
  108.                 return        t->type;
  109.         }
  110.         if(cur_char=='.'||isdigit(cur_char)){
  111.                         next_char=get_char();
  112.                         if(cur_char=='0' && (next_char=='X' || next_char=='x')){
  113.                                 t->text[n++]=cur_char;
  114.                                 t->text[n++]=next_char;
  115.                                 cur_char=get_char();
  116.                                 while(is_hex(cur_char)){
  117.                                         if(n<BUFFER_SIZE-1)        t->text[n++]=cur_char;
  118.                                         cur_char=get_char();
  119.                                 }
  120.                                 t->text[n++]=0;
  121.                                 t->val=t->uval=hex_atou(t->text);
  122.                                 return        t->type=LEX_INT;
  123.                                
  124.                         }else{
  125.                                 if(cur_char=='.')
  126.                                         dot=1;
  127.                                 else
  128.                                         num=1;
  129.                                 if(n<BUFFER_SIZE-1)        t->text[n++]=cur_char;
  130.                                 cur_char=next_char;
  131.                                 do{
  132.                                         if(dot && cur_char=='.'){
  133.                                                 strcpy(t->text,"error");
  134.                                                 return        t->type=LEX_ERROR;
  135.                                         }
  136.                                         if(!(cur_char=='.'||isdigit(cur_char)))
  137.                                                 break;
  138.                                         if(cur_char=='.')
  139.                                                 dot=1;
  140.                                         else
  141.                                                 num=1;
  142.                                         t->text[n++]=cur_char;
  143.                                         cur_char=get_char();
  144.                                 }while(1);
  145.                                 if((cur_char=='e'||cur_char=='E') && num){
  146.                                         dot=1;
  147.                                         if(n<BUFFER_SIZE-1)        t->text[n++]=cur_char;
  148.                                         cur_char=get_char();
  149.                                         if(cur_char=='+'||cur_char=='-'){
  150.                                                 if(n<BUFFER_SIZE-1)        t->text[n++]=cur_char;
  151.                                                 cur_char=get_char();
  152.                                         }
  153.                                         if(isdigit(cur_char)){
  154.                                                 do{
  155.                                                         if(n<BUFFER_SIZE-1)        t->text[n++]=cur_char;
  156.                                                         cur_char=get_char();
  157.                                                 }while(isdigit(cur_char))        ;
  158.                                         }else{
  159.                                                 strcpy(t->text,"error");
  160.                                                 return        t->type=LEX_ERROR;
  161.                                         }
  162.                                 }
  163.                                 if(dot){
  164.                                         t->type=LEX_FLOAT;
  165.                                         if(cur_char=='d' || cur_char=='D' || cur_char=='f' || cur_char=='F'){
  166.                                                 if(n<BUFFER_SIZE-1)        t->text[n++]=cur_char;
  167.                                                 cur_char=get_char();
  168.                                         }
  169.                                 }else{
  170.                                         t->type=LEX_INT;
  171.                                         if(cur_char=='L' || cur_char=='l'){
  172.                                                 if(n<BUFFER_SIZE-1)        t->text[n++]=cur_char;
  173.                                                 cur_char=get_char();
  174.                                         }else        if(cur_char=='d' || cur_char=='D' || cur_char=='f' || cur_char=='F'){
  175.                                                 t->type=LEX_FLOAT;
  176.                                                 if(n<BUFFER_SIZE-1)        t->text[n++]=cur_char;
  177.                                                 cur_char=get_char();
  178.                                         }
  179.                                 }
  180.                         }
  181.                         if(t->type==LEX_FLOAT){
  182.                                 t->dval=atof(t->text);
  183.                         }else{
  184.                                 t->val=t->uval=atol(t->text);
  185.                         }
  186.                         t->text[n++]=0;
  187.                         return        t->type;
  188.         }
  189.         if(cur_char=='"'){
  190.                 cur_char=get_char();
  191.                 for(;cur_char!='"' && cur_char!=EOF;){
  192.                         if(cur_char=='\\'){
  193.                                 if(n<BUFFER_SIZE-1)        t->text[n++]=cur_char;
  194.                                 cur_char=get_char();
  195.                         }
  196.                        
  197.                         if(cur_char=='\r' || cur_char=='\n')
  198.                                 while(cur_char=='\r' || cur_char=='\n')
  199.                                         cur_char=get_char();
  200.                         else if(cur_char!=EOF){
  201.                                 if(n<BUFFER_SIZE-1){
  202.                                         t->text[n++]=cur_char;
  203.                                         cur_char=get_char();
  204.                                 }
  205.                          }
  206.                 }
  207.                 t->text[n++]=0;
  208.                 if(cur_char!='"'){
  209.                         t->type=LEX_ERROR;
  210.                         sprintf(t->text,"\" missing.");
  211.                         cur_char=get_char();
  212.                         return        t->type;
  213.                 }
  214.                 cur_char=get_char();
  215.                 t->type=LEX_STRING;
  216.                 return        t->type;
  217.         }

  218.         if(cur_char=='\''){
  219.                 cur_char=get_char();
  220.                 if(cur_char=='\\'){
  221.                         t->text[n++]=cur_char;
  222.                         cur_char=get_char();
  223.                         t->text[n++]=cur_char;
  224.                         cur_char=get_char();
  225.                 }
  226.                 while(cur_char!='\'' && cur_char!=LEX_EOF){
  227.                         if(n<BUFFER_SIZE-1)t->text[n++]=cur_char;
  228.                         cur_char=get_char();
  229.                 }
  230.                 if(cur_char!='\''){
  231.                         strcpy(t->text,"missing        \'");
  232.                         t->type=LEX_ERROR;
  233.                 }
  234.                 t->text[n++]=0;
  235.                 cur_char=get_char();
  236.                 t->type=LEX_QUOTE;
  237.                
  238.                 return        t->type;
  239.         }else if(cur_char==':'){
  240.                 next_char=get_char();
  241.                 if(next_char==':'){
  242.                         t->text[n++]=cur_char;
  243.                         cur_char=next_char;
  244.                         next_char=get_char();
  245.                         t->type=LEX_DOUBLEKOLON;
  246.                 }else{
  247.                         t->type=cur_char;
  248.                 }
  249.                 t->text[n++]=cur_char;
  250.                 t->text[n++]=0;
  251.                 cur_char=next_char;
  252.         }else{
  253.                 t->text[n++]=cur_char;
  254.                 t->text[n++]=0;
  255.                 t->type=cur_char;
  256.                 cur_char=get_char();
  257.         }
  258.         return        t->type;
  259. }
复制代码

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
14 [报告]
发表于 2013-06-06 12:19 |只看该作者
这段代码写的还算好吧。
可读性不错。

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
15 [报告]
发表于 2013-06-06 19:41 |只看该作者
解析文本的用状态机大段代码很常见的。

论坛徽章:
3
15-16赛季CBA联赛之山东
日期:2016-10-30 08:47:3015-16赛季CBA联赛之佛山
日期:2016-12-17 00:06:31CU十四周年纪念徽章
日期:2017-12-03 01:04:02
16 [报告]
发表于 2013-06-08 00:41 |只看该作者
这是 Android init 程序的代码。

叔叔认为:

写,得,很,好,很,清,晰。

论坛徽章:
0
17 [报告]
发表于 2013-06-08 15:43 |只看该作者
我赶脚写得还不错,至少我基本看懂了。。

虽然我不喜欢这种典型的C简洁风格

论坛徽章:
0
18 [报告]
发表于 2013-06-11 19:04 |只看该作者
代码很好,虽然没有注释,但很容易看懂。

论坛徽章:
1
金牛座
日期:2013-10-10 22:06:28
19 [报告]
发表于 2013-06-11 20:04 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP