【问题标题】:Lex case insensitive word detectionLex 不区分大小写的单词检测
【发布时间】:2014-03-27 11:23:17
【问题描述】:

我需要处理 C 中的字符串,其中某些单词(如果存在)必须转换为大写。我的第一选择是像这样在 LEX 中工作:

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

我看到的问题是我无法检测某些字符是否为大写(例如 Word1、wOrd1...)。这可能意味着一个一个列表:

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

%%

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

如果没有,有什么解决方法建议吗?

【问题讨论】:

  • 你能在词法分析之前预处理(某些词的小写)吗?
  • 事实上,这已经是另一个词法分析过程的预处理。我的问题是怎么做。

标签: c lex


【解决方案1】:

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

%option caseless

您可以致电flex -i

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

(?i:word)

【讨论】:

  • 我已经阅读了有关该选项的信息,但是据我所知,这意味着词法分析器中的每个标记都不区分大小写,不是吗?
  • @jordi:见扩展答案。假设你使用flex;我没有使用lex 的经验,不知道它是否支持。
  • 上升。对不起。我会试试的。
  • 看起来 lex 不支持它。我找到了另一种方法。
  • 关于 flex,(?i:word) 记录在这里:flex.sourceforge.net/manual/Patterns.html。 2.5.34以后就可以使用了。
【解决方案2】:

似乎可行的方式是这样的:

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

【讨论】:

  • 这就是你使用古老工具所得到的。 ;-)
  • Bear Grylls 的编程 :)
  • 过去,我曾经将 26 个定义粘贴到我的 lex 文件中:A [Aa]B [Bb]、...,然后你可以写 {W}{O}{R}{D}。虽然它不比[Ww][Oo][Rr][Dd] 短很多,但打字更容易一些。 flex 更好。
【解决方案3】:

它非常简单,可以按原样提供您的模式和动作,不用担心。 在编译时给它, lex -i 文件名.l 这是在 LINUX 系统上。

【讨论】:

    猜你喜欢
    • 2015-08-30
    • 1970-01-01
    • 1970-01-01
    • 2015-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-29
    • 2016-07-12
    相关资源
    最近更新 更多