2014-11-01 59 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]);} 

%% 

(起點和終點包含開始和結束的分隔符,例如「」或¿?)

我嘗試使用OEA<<'EOF'>>,但Flex編譯器顯示"unrecognized rule.."

有人可以幫助我嗎? :)

回答

0

根據Posix,一個非空的文本文件應該總是以換行符結尾;以「不完整行」結尾的文件不嚴格地說,不需要以文本文件作爲輸入的文本文件和標準實用程序來正確處理尾隨「未完成行」。無論如何,這就是理論。

實際上,獲取不以換行符結尾的文本流並不容易。大多數Unix實用程序將添加一個,除非明確告知不要(例如-n命令行選項爲echo,例如,它不是Posix標準)。許多公用事業公司沒有辦法避免後面的換行符(sortgrep,就在我頭上)。

如果你想正確處理這些輸入,那麼這對你來說沒有太大的幫助。更多的是通過解釋爲什麼在flex中很難做到這一點。在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; }