Flex - 在EOF之前检测单词

时间:2014-11-01 03:36:13

标签: c regex flex-lexer eof

我正在使用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.."

有人可以帮助我吗? :)

1 个答案:

答案 0 :(得分:0)

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

在实践中,获取不以换行符结尾的文本流并不是一件容易的事。大多数Unix实用程序都会添加一个,除非明确告知不要(-n命令行选项echo,例如,不是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; }