我正在使用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.."
有人可以帮助我吗? :)
答案 0 :(得分:0)
根据Posix,非空文本文件应始终以换行符结尾;严格来说,以“不完整行”结尾的文件不是以文本文件作为输入的文本文件和标准实用程序,不需要正确处理尾随的不完整行。无论如何,这就是理论。
在实践中,获取不以换行符结尾的文本流并不是一件容易的事。大多数Unix实用程序都会添加一个,除非明确告知不要(-n
命令行选项echo
,例如,不是Posix标准的)。许多实用程序无法避免尾随换行符(sort
和grep
,只是在我的头顶。)
如果您想正确处理此类输入,这些对您没有多大帮助。它更多的是通过解释为什么在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; }