2014-09-04 92 views
0

在我的生活中,我無法弄清楚我的正則表達式有什麼問題。爲什麼flex正則表達式被跳過?

我想標記的是兩種類型的字符串,這兩種字符串都包含在一行中。一個字符串可以是任何東西(除了新行),另一個字符串可以是任何字母數字(ASCII)字符和文字'_','/'' - '和'。'。

的Flex代碼的片段是:

nl \n|\r\n|\r|\f|\n\r 
... 
%% 
... 
\"[^\"]+{nl} { frx_parser_error("Label is missing trailing double quote."); } 
\"[a-zA-Z0-9_\.\/\-]+\" { 
     if (yyleng > 1024) frx_parser_error("File name too long."); 
     yytext[yyleng - 1] = '\0'; 
     frx_parser_lval.str = strdup(yytext+1); 
     fprintf(stderr,"TOSP_FILENAME: %s\n", frx_parser_lval.str); 
     return (TOSP_FILENAME); 
    } 
\"[^{nl}]+\" { 
     yytext[yyleng - 1] = '\0'; 
     frx_parser_lval.str = strdup(yytext+1); 
     fprintf(stderr,"TOSP_IDENTIFIER:\n%s\n", frx_parser_lval.str); 
     return (TOSP_IDENTIFIER); 
    } 

當我運行解析器,該fprintf的吐出了這一點:

TOSP_FILENAME: ModStar-Picture-Analysis.txt 
TOSP_FILENAME: ModStar-Rubric.log.txt 
TOSP_IDENTIFIER: 
picture-A" 
Progress (26,255) camera 'C' root("picture-C- 
Syntax (line 34): syntax error 

無論出於何種原因,picture-A後該帖被......錯過了。爲什麼?我檢查了引用字符出現的8個位置的ASCII值,它們都是0x22(出現雙精度查找的地方)。

如果我在"picture-A"的末尾添加一些字符,它可能有時會起作用;添加「.par」,「.pbr」不能按預期工作,但「.pnr」會。

我甚至增加了一個特定的非regexy令牌:

\"picture-A\" { frx_parser_lval.str = strdup("picture-A"); return TOSP_FILENAME; } 

到法文件和被跳過。

我在lex文件中使用Flex 39年2月5日,沒有彎曲庫,一個選項(%option prefix=frx_parser_)和Flex命令行是:

flex -t script-lexer.l > script-lexer.c 

是怎麼回事?

編輯我需要測試這個實際的系統,但單元測試表明,該分詞器是更健壯(基於羅傑斯國際商品指數的答案):

nl  \n|\r\n|\r|\f|\n\r 
... 
%% 
... 
["][^"]+{nl}   { printf("Missing trailing quote.\n%s\n",yytext); } 
["][[:alnum:]_./-]+["] { printf("File name:\n%s\n",yytext); } 
["][^"]+["]   { printf("String:\n%s\n",yytext); } 

編輯規則["].+["]燕子連續多個字符串作爲一個大字符串。又改爲["][^"]+["]

回答

3

的問題是你的模式:

\"[^{nl}]+\" 

你試圖擴大字符類中的定義,但是這是不可能的;在字符類中,{總是隻是一個{,而不是一個flex運算符。見flex manual

注意,一個字符類的內部,所有的正則表達式運營商失去了其特殊的含義,除了逃生(「\」)和字符類運營商,「 - 」,「]」,並且,在課程開始時,'^'。

定義是而不是宏。相反,定義定義了一個新的正則表達式運算符。

作爲上述的結果,可以編寫[^\"]簡單地[^"]\"[a-zA-Z0-9_\.\/\-]+\"\"[a-zA-Z0-9_./-]+\"(該-需要是在任一末端或開頭。)就個人而言,我會寫第二圖案爲:

["][[:alnum:]_./-]+["] 

但是每個人都有自己的風格。

+0

謝謝repsonse。一(1)個問題需要明確:除了我的錯誤定義用法外,您斷言我的「擴展」導致了意外的行爲? – Jamie 2014-09-06 16:10:06

+1

@Jamie:不,現在我更仔細地看,它的意外行爲也是你在模式中不包括'''的結果。在字符類中使用'{nl}'只會增加更多的不可預測性。請注意,如果它的定義是宏擴展,它將不起作用,因爲'nl'是序列的析取,而不是一組單個字符。 – rici 2014-09-06 21:21:16

+0

Totaly是有意義的,謝謝。 – Jamie 2014-09-07 00:50:53