例如,我應該將「int」轉換爲「INT」。但如果有「整數」這個詞,我認爲它不應該變成「INTeger」。Lex:我如何防止它與子串匹配?
如果我定義了"int" printf("INT");
,但子串仍然匹配。有沒有辦法來防止這種情況發生?
例如,我應該將「int」轉換爲「INT」。但如果有「整數」這個詞,我認爲它不應該變成「INTeger」。Lex:我如何防止它與子串匹配?
如果我定義了"int" printf("INT");
,但子串仍然匹配。有沒有辦法來防止這種情況發生?
我相信以下內容可以捕獲您想要的內容。
%{
#include <stdio.h>
%}
ws [\t\n ]
%%
{ws}int{ws} { printf ("%cINT%c", *yytext, yytext[4]); }
. { printf ("%c", *yytext); }
擴大這種超越字邊界({ws}
,在這種情況下),你需要以添加改性劑ws
或添加更多specifc檢查。
好,我是這樣做的:
(("int"([a-z]|[A-Z]|[0-9])+)|(([a-z]|[A-Z]|[0-9])+"int")) ECHO;
"int" printf("INT");
更好的建議表示歡迎。
Lex會爲當前輸入選擇最長匹配的規則。要避免子字符串匹配,您需要包含一個長於int
的附加規則。要做到這一點最簡單的方法是添加一個簡單的規則,選擇長度超過一個字符的任何字符串,即[a-zA-Z]+
。整個lex程序看起來像這樣: -
%%
[\t ]+ /* skip whitespace */
int { printf("INT"); }
[a-zA-Z]+ /* catch-all to avoid substring matches */
%%
int main(int argc, char *argv[])
{
yylex();
}
這將改變「stint」,所以也許你需要兩端的ws。還有像int * x這樣的東西呢? – 2010-03-02 01:40:47
這是正確的答案。 – samoz 2010-03-02 03:27:50