C 不区分大小写的单词检测
我需要在C语言中处理一个字符串,其中某些单词(如果存在)必须转换为大写。我的第一个选择是在LEX中工作,比如:C 不区分大小写的单词检测,c,lex,C,Lex,我需要在C语言中处理一个字符串,其中某些单词(如果存在)必须转换为大写。我的第一个选择是在LEX中工作,比如: %% word1 {setToUppercase(yytext);RETURN WORD1;} word2 {setToUppercase(yytext);RETURN WORD2;} word3 {setToUppercase(yytext);RETURN WORD3;} %% 我看到的问题是,我无法检测某些字符是否为大写(f.e.Word1,Word1…)。这可
%%
word1 {setToUppercase(yytext);RETURN WORD1;}
word2 {setToUppercase(yytext);RETURN WORD2;}
word3 {setToUppercase(yytext);RETURN WORD3;}
%%
我看到的问题是,我无法检测某些字符是否为大写(f.e.Word1,Word1…)。这可能意味着一个接一个的列表:
%%
word1 |
Word1 |
WOrd1
{setToUppercase(yytext);RETURN WORD1;}
%%
有没有一种方法可以定义在不区分大小写的模式下比较这个特殊的标记?我发现我可以将lexer编译为不区分大小写的,但这会影响程序的其他部分
如果没有,是否有解决方案建议?您可以在
.l
文件中设置不区分大小写:
%option caseless
您可以调用flex-i
或者,您可以将单个规则声明为不区分大小写:
(?i:word)
似乎是这样的:
(W|w)(O|o)(R|r)(D|d) {setToUppercase(yytext);}
这很简单,让你的模式和行动,因为它是,不要担心。 在编译时,将其作为, lex-i filename.l
这是在LINUX系统上。您能在词法分析之前预处理(某些单词的情况下)吗?事实上,这已经是另一个词法分析过程的预处理了。我的问题是怎么做。我读过关于这个选项的书,但是,据我所知,这意味着lexer中的每个标记都不区分大小写,不是吗?@jordi:参见扩展答案。假设您使用
flex
;我没有使用lex
的经验,也不知道它是否支持这个.Ups。很抱歉我会试试的。看起来lex不支持它。我找到了另一种方法。关于flex,(?I:word)
记录在这里:。您可以使用2.5.34版之后的版本。这就是使用古代工具所得到的结果。;-)Bear Grylls of Programming:)回到那一天,我常常将26个定义粘贴到我的lex文件中:A[Aa]
,B[Bb]
,…,然后你就可以写{W}{O}{R}{D}
。虽然它比[Ww][Oo][Rr][Dd]
短不了多少,但它更容易键入flex
更好。