Lex不区分大小写的单词检测

jor*_*rdi 10 c lex

我需要在C中处理一个字符串,其中某些单词(如果存在)必须转换为大写.我的第一选择是在LEX中使用这样的东西:

%%
word1    {setToUppercase(yytext);RETURN WORD1;}
word2    {setToUppercase(yytext);RETURN WORD2;}
word3    {setToUppercase(yytext);RETURN WORD3;}
%%
Run Code Online (Sandbox Code Playgroud)

我看到的问题是我没有检测到某些字符是否为大写(fe Word1,wOrd1 ......).这可能意味着一个接一个地列出:

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

%%
Run Code Online (Sandbox Code Playgroud)

有没有一种方法可以定义这种特定的令牌在不区分大小写的模式下进行比较?我发现我可以编译词法分析器不区分大小写,但这会影响我程序的其他部分.

如果没有,任何解决方案建议?

Dev*_*lar 16

您可以在.l文件中设置不区分大小写:

%option caseless
Run Code Online (Sandbox Code Playgroud)

你可以打电话flex -i.

或者您可以声明个别规则不区分大小写:

(?i:word)
Run Code Online (Sandbox Code Playgroud)

  • 关于**f**lex,`(?i:word)`在此处记录:http://flex.sourceforge.net/manual/Patterns.html.您可以在2.5.34版之后使用. (2认同)

jor*_*rdi 2

似乎有效的方法是这样的:

(W|w)(O|o)(R|r)(D|d) {setToUppercase(yytext);}
Run Code Online (Sandbox Code Playgroud)

  • 以前,我曾经将 26 个定义粘贴到我的 lex 文件中:`A [Aa]`、`B [Bb]`、...,然后您可以编写 `{W}{O}{R}{ D}`。虽然它比“[Ww][Oo][Rr][Dd]”短不了多少,但输入起来更容易一些。“弹性”更好。 (6认同)