Распознавание слов без учета регистра Lex

мне нужно treate строку в C, где некоторые слова, если они присутствуют, должны быть преобразованы в верхний регистр. Мой первый выбор состоял в том, чтобы работать в LEX что-то вроде этого:

%%
word1    {setToUppercase(yytext);RETURN WORD1;}
word2    {setToUppercase(yytext);RETURN WORD2;}
word3    {setToUppercase(yytext);RETURN WORD3;}
%%

проблема, которую я вижу, заключается в том, что я не могу определить, являются ли некоторые символы прописными (f.e. Слово 1, слово 1...). Это может означать по одному листингу:

%%
word1   |
Word1   |
WOrd1   
 {setToUppercase(yytext);RETURN WORD1;}

%%

есть ли способ определить, что эти особые маркеры должны сравниваться в нечувствительном к регистру режиме? Я понял, что могу. скомпилируйте лексер без учета регистра, но это может повлиять на другие параметры моей программы.

Если нет, любое предложение обходного пути?

3 ответов


вы можете установить нечувствительность к регистру в :

%option caseless

можно назвать flex -i.

или вы можете указать отдельные правила без учета регистра:

(?i:word)

его очень просто дать ваши шаблоны и действия,как это, не волнуйтесь. При компиляции дайте его как, Лекс -я именем.l Это в системах LINUX.


Кажется, что это работает так:

(W|w)(O|o)(R|r)(D|d) {setToUppercase(yytext);}