2012-04-26 80 views
0

如何在Flex中將用戶輸入轉換爲小寫?看着一行,但沒有發現任何有用的東西。FLEX/BISON - 如何將用戶輸入轉換爲小寫?

當我嘗試這樣做:

yylval.string = strdup(tolower(yytext)); 

我得到錯誤提示:合格「tolower的」 ARG 1將指針整數,未作演員。

感謝, 薩拉

回答

1
%{ 
#include <stdio.h> 
#include <ctype.h> 
%} 
%% 
[A-Z] putchar(tolower(*yytext)); 

如果你想整個字符串轉換爲小寫,你需要調用tolower在一個循環中,作爲tolower只將單個字符:

for (i = 0; yytext[i]; i++) 
    yytext[i] = tolower(yytext[i]); 
yylval.string = strdup(yytext); 
+0

謝謝。我正在使用聯盟。我將如何改變這種情況:yylval.str = strdup(yytext); – sap 2012-04-26 17:15:38

+0

您的解決方案很好,但是在令牌匹配後調用。但我希望用戶輸入任何一個單詞,它應該與規則相匹配。這個頁面http://www.esiee.fr/~najmanl/compil/Flex/flex_2.html正在討論一個宏,但不知道如何使用它。 – sap 2012-04-27 17:21:05

+0

謝謝......但沒有upvote或接受! – Kaz 2012-04-28 18:58:47

0

您可以重新定義頂部「C」部分中的YY_INPUT宏:

#define YY_INPUT(buf,result,max_size) \ 
     { \ 
     int c = '*', n; \ 
     for (n = 0; n < max_size && \ 
       (c = getc(yyin)) != EOF && c != '\n'; ++n) \ 
      buf[n] = (char) tolower(c); \ 
     if (c == '\n') \ 
      buf[n++] = (char) tolower(c); \ 
     if (c == EOF && ferror(yyin)) \ 
      YY_FATAL_ERROR("input in flex scanner failed"); \ 
     result = n; \ 
     } 
+0

不是一個好主意,在下一個flex版本(或者你在大客戶端安裝時被迫使用的史前版本)中,所述宏的細節可能會有所不同。 – vonbrand 2013-02-02 17:17:12