2012-04-26 3 views
0

Как преобразовать пользовательский ввод в нижний регистр в Flex? Посмотрел по строке, но не нашел ничего полезного.FLEX/BISON - Как преобразовать пользовательский ввод в нижний регистр?

Когда я пытаюсь сделать это:

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

Я получаю сообщение об ошибке с указанием: проходящее ARG 1 из «TOLOWER» делает целое число от указателя без броска.

Спасибо, Сара

ответ

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

+0

Ваше решение хорошее, но это вызывается после согласования маркера. Но я хочу, чтобы пользователь вводил слово в любой обложке, и он должен соответствовать правилу. Эта страница http://www.esiee.fr/~najmanl/compil/Flex/flex_2.html говорит о макросе, но не знает, как ее использовать. – sap

+0

Спасибо ... но не отвини или не принимай! – Kaz

0

вы можете переопределить макрос 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 (или доисторической, которую вы вынуждены использовать при установке на сайте Big Client). – vonbrand

Смежные вопросы