Согласно Posix, непустой текстовый файл должен всегда заканчиваться символом новой строки; файлы, которые заканчиваются «неполной линией», не являются, строго говоря, текстовыми файлами и стандартными утилитами, которые принимают текстовые файлы в качестве входных данных, не требуются для правильной обработки конечной незавершенной строки. Во всяком случае, это теория.
На практике не так просто получить текстовый поток, который не заканчивается символом новой строки. Большинство утилит Unix добавят один, если явно не указано (опция -n
командной строки для echo
, например, которая не является Posix-стандартом). Многие утилиты не позволяют избежать отстающей новой строки (sort
и grep
, совсем рядом с моей головой).
Ничто из этого не поможет вам, если вы хотите правильно обрабатывать такие входы. Это больше объясняется тем, почему это сложно делать в flex. В флекс, $
на самом деле означает «с последующим символом новой строки», и это точно такой же, как с указанием контекста ведомой, поэтому эти две модели идентичны:
OEA/"\n"
OEA$
Обратите внимание, что /
является «трейлинг контекст» сгибать-х оператор, который 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; }