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