gpt4 book ai didi

c - Flex - 检测 EOF 之前的单词

转载 作者:行者123 更新时间:2023-11-30 17:26:42 26 4
gpt4 key购买 nike

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

有人可以帮助我吗? :)

最佳答案

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

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

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

OEA/"\n"
OEA$

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

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

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

^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; }

关于c - Flex - 检测 EOF 之前的单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26685987/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com