關於lex中正則表達式區分減號和負號(正後顧不可用)

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,簡單易懂,代碼不完善,有錯誤和新想法歡迎交流



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章