【问题标题】:Flex - Detect word before EOFFlex - 在 EOF 之前检测单词
【发布时间】:2014-11-01 03:36:12
【问题描述】:

我正在与 Flex 合作,我需要做一个首字母缩写词翻译器。我正在尝试在文件结尾之前检测一个单词,例如:

OEA?

OEA ¿OEA?

OEA

在这种情况下,flex 会检测前三个首字母缩写词,但最后一个 OEA 不会翻译。我在规则中有下一个代码:

%%

^OEA$ {fprintf(yyout,"Organizacion de los Estados Americanos");}
{START}OEA$ {fprintf(yyout,"%cOrganizacion de los Estados Americanos",yytext[0]);}
^OEA{END} {fprintf(yyout,"Organizacion de los Estados Americanos%c",yytext[yyleng-1]);}
{START}OEA{END} {fprintf(yyout,"%cOrganizacion de los Estados Americanos%c",yytext[0],yytext[yyleng-1]);}

%%

(START 和 END 包含开始和结束分隔符,例如 " " 或 ¿ ?)

我尝试使用 OEA<<'EOF'>>,但 flex 编译器显示 "unrecognized rule.."

有人可以帮助我吗? :)

【问题讨论】:

    标签: c regex flex-lexer eof


    【解决方案1】:

    根据 Posix,非空文本文件应始终以换行符结尾;严格来说,以“不完整行”结尾的文件不是文本文件,而将文本文件作为输入的标准实用程序不需要正确处理尾随的不完整行。无论如何,这就是理论。

    在实践中,获得不以换行符结尾的文本流并不容易。大多数 Unix 实用程序都会添加一个,除非明确告知不要(例如,echo-n 命令行选项,这不是 Posix 标准)。许多实用程序无法避免尾随换行符(sortgrep,就在我的脑海中)。

    如果您想正确处理此类输入,这些都对您没有多大帮助。它更多地是为了解释为什么在 flex 中很难做到。在 flex 中,$ 真正的意思是“后跟一个换行符”,它与指定尾随上下文完全相同,所以这两种模式是相同的:

    OEA/"\n"
    OEA$
    

    请注意,/ 是 flex 的“尾随上下文”运算符,afaik 不会出现在任何其他正则表达式语言中。

    这与 ^ 运算符不同,后者匹配文件中的第一个字符和换行符之后的任何字符。

    您的模式当然可以通过使用/ 运算符来简化;这也将允许您识别尾随字符串,尽管它有点难看:

    ^OEA/{END}       { fputs("Organización de Estados Americanos", yyout); }
    ^OEA             { fputs("Organización de Estados Americanos", yyout); }
    {START}OEA/{END} { fputc(yytext[0], yyout);
                       fputs("Organización de Estados Americanos", yyout); }
    {START}OEA       { fputc(yytext[0], yyout);
                       fputs("Organización de Estados Americanos", yyout); }
      /* These two patterns will match instead of the ones without trailing context,
       * because they are longer. The only way the patterns without trailing context
       * can match is if these don't match, which can only happen if the OEA is at
       * the end of a line or the end of the file.
       */ 
    ^OEA/.           { ECHO; }
    {START}OEA/.     { ECHO; }
    

    【讨论】:

      猜你喜欢
      • 2017-10-21
      • 1970-01-01
      • 2010-11-28
      • 1970-01-01
      • 1970-01-01
      • 2015-04-22
      • 1970-01-01
      • 2012-03-14
      • 1970-01-01
      相关资源
      最近更新 更多