2010-03-01 35 views
1

例如,我應該將「int」轉換爲「INT」。但如果有「整數」這個詞,我認爲它不應該變成「INTeger」。Lex:我如何防止它與子串匹配?

如果我定義了"int" printf("INT");,但子串仍然匹配。有沒有辦法來防止這種情況發生?

回答

2

我相信以下內容可以捕獲您想要的內容。

%{ 
#include <stdio.h> 
%} 

ws      [\t\n ] 

%% 

{ws}int{ws}   { printf ("%cINT%c", *yytext, yytext[4]); } 
.      { printf ("%c", *yytext); } 

擴大這種超越字邊界({ws},在這種情況下),你需要以添加改性劑ws或添加更多specifc檢查。

+0

這將改變「stint」,所以也許你需要兩端的ws。還有像int * x這樣的東西呢? – 2010-03-02 01:40:47

+0

這是正確的答案。 – samoz 2010-03-02 03:27:50

1

好,我是這樣做的:

(("int"([a-z]|[A-Z]|[0-9])+)|(([a-z]|[A-Z]|[0-9])+"int")) ECHO; 
"int" printf("INT"); 

更好的建議表示歡迎。

1

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(); 
    }