在我的生活中,我無法弄清楚我的正則表達式有什麼問題。爲什麼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); }
編輯規則["].+["]
燕子連續多個字符串作爲一個大字符串。又改爲["][^"]+["]
謝謝repsonse。一(1)個問題需要明確:除了我的錯誤定義用法外,您斷言我的「擴展」導致了意外的行爲? – Jamie 2014-09-06 16:10:06
@Jamie:不,現在我更仔細地看,它的意外行爲也是你在模式中不包括'''的結果。在字符類中使用'{nl}'只會增加更多的不可預測性。請注意,如果它的定義是宏擴展,它將不起作用,因爲'nl'是序列的析取,而不是一組單個字符。 – rici 2014-09-06 21:21:16
Totaly是有意義的,謝謝。 – Jamie 2014-09-07 00:50:53