2014-09-04 91 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