在我的生活中,我无法弄清楚我的正则表达式有什么问题。为什么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