关于lex中正则表达式区分减号和负号(正后顾不可用)

来源:互联网 发布:ubuntu卸载搜狗拼音 编辑:程序博客网 时间:2024/05/21 17:50

1. 减号和负号区别解释

减号是一种运算符,负号是数字的特质,两者不能混为一谈。

例如: a=a-10和a-=-10,前者是减号 是运算符,后者是表示这是一个负数,小于零。

2.利用正则式的正后顾解决

最初的想法是利用正则式中的后顾解决这个问题。先来科普一下正前瞻和正后顾:

      正前瞻:假设要匹配单词my ,要求紧随其后的单词是friend,要达到这个目的,便使用正前瞻。

      (?i)my (?=friend)

      (?i)的意思是不区分大小写;实际匹配是,会寻找后面跟着单词friend的my,而且被标亮的只有my

      正后顾:正后顾会查看左边的内容,与正前瞻的方向相反。语法为:

      (?i)(?<=my) friend

      意思是查找前面是单词my的friend单词,这个时候匹配的是friend,被标亮的也是friend,而且前面没有my的friend单词不会被标亮。

      分析

         ①若为减号:则基本形式为a-b;a-10;10-a;抽象为一般形式为:(变量|常量)-(变量|常量)。操作符减号前后应该有两个操作数;

         ②若为负号:则基本形式为a=-10;a+=-10;a-=-10;a+=(-10);-10+a;抽象为一般形式为:(运算符|分界符|NULL)(负数)

窃以为:lex不支持正前瞻和正后顾

3.解决方法

本人小白,用了一上午想办法查资料来解决这个问题,都没有搞定,也没有看到相关lex中使用正后顾的资料。只好在动作里进行自动分离。
第一个是预定义里定义代码:特别定义出来减号和负号
fuhao ["="|"+="|"("](-([0-9])+)jianhao {chars}+(-([0-9])+)
第二是在识别动作里进行分离:
//输出格式为23    (4,abd){jianhao} {                             //假设a = abc-10          count++;//自定义单词计数变量          printf("%d\t(4,",count);//先输出(4,          for(i=0;yytext[i]!='-';i++)//输出减号之前的abc              printf("%c",yytext[i]);          printf(")\n");//输出 )            count++;          printf("%d\t(4,'%c')\n",count,yytext[i++]);//输出减号            count++;  printf("%d\t(3,",count);//输出(3,            for(;i<yyleng;i++)          printf("%c",yytext[i]);//输出10          printf(")\n");          }          {fuhao} {                                      //假设 a+=-10         count++;         if(yytext[0]=='=')printf("%d\t(4,'%c')\n",count,yytext[0]);//a=-10   输出运算符和分界符之类的         else if (yytext[0]=='(')printf("%d\t(5,'%c')\n",count,yytext[0]);//a=b*(-10)         else if (yytext[0]=='+=')printf("%d\t(5,'%c%c')\n",count,yytext[0],yytext[1]);//a+=-10              count++; printf("%d\t(3,",count);//输出23     (3,         for(i=2;i<yyleng;i++)//继续输出 printf("%c",yytext[i]);     printf(")\n");        }
方法比较low,简单易懂,代码不完善,有错误和新想法欢迎交流



1 0