2014-11-01 2 views
0

Я работаю с Flex, и мне нужно сделать переводчик акронимов. Я пытаюсь обнаружить слово до конца файла, например:Flex - определить слово перед EOF

OEA?

OEA ¿OEA?

OEA

В этом случае изгибаться обнаружить первые три аббревиатуру, но последний 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'>>, но гибкий компилятор показывает "unrecognized rule.."

Кто-нибудь может мне помочь? :)

ответ

0

Согласно 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; } 
Смежные вопросы