代码之家  ›  专栏  ›  技术社区  ›  qed

flex无法识别字符范围[关闭]

  •  1
  • qed  · 技术社区  · 7 年前

    这是输入文件:

    /* input.l */
    %%
    "[0-9]+" {printf("NUMBER: %s\n", yytext);}
    "+" {printf("PLUS\n");}
    "-" {printf("MINUS \n");}
    "*" {printf("TIMES \n");}
    "/" {printf("DIVIDE\n");}
    "|" {printf("abs\n");}
    "\n" {printf("NEWLINE\n");}
    "[ \t]" {printf("WHITESPACE\n");} 
    . {printf("UNKNOWN: %s\n", yytext);} 
    %%
    

    编译并运行:

    flex -X input.l && cc lex.yy.c -lfl && ./a.out
    a
    UNKNOWN: a
    NEWLINE
    1
    UNKNOWN: 1
    NEWLINE
    1 + 3
    UNKNOWN: 1
    UNKNOWN:
    PLUS
    UNKNOWN:
    UNKNOWN: 3
    NEWLINE
    

    请注意,flex缺少这两种功能 [0-9] [ \t] .

    为什么会这样?

    操作系统:Ubuntu 18.10 柔性版:2.6.4

    2 回复  |  直到 7 年前
        1
  •  1
  •   pynexj    7 年前

    查看了几年前编写的flex代码,我设法使以下代码正常工作(在 Debian 9.5 )只是FIY。

    (我忘了为什么 yywrap() 是需要的。:)

    [STEP 101] # cat foo.l
    %%
    [0-9]+ { printf("NUMBER: %s\n", yytext); }
    "+"    { printf("PLUS\n"); }
    "-"    { printf("MINUS \n"); }
    "*"    { printf("TIMES \n"); }
    "/"    { printf("DIVIDE\n"); }
    "|"    { printf("abs\n"); }
    "\n"   { printf("NEWLINE\n"); }
    [ \t]+ { printf("WHITESPACE\n"); }
    .      { printf("UNKNOWN: %s\n", yytext); }
    %%
    
    int yywrap(void)
    {
        return 1;
    }
    
    int main()
    {
        yylex();
        return 0;
    }
    [STEP 102] # flex foo.l
    [STEP 103] # cc lex.yy.c
    [STEP 104] # ./a.out
    1 + 3
    NUMBER: 1
    WHITESPACE
    PLUS
    WHITESPACE
    NUMBER: 3
    NEWLINE
    a
    UNKNOWN: a
    NEWLINE
    [STEP 105] #
    
        2
  •  2
  •   rici    7 年前

    因为你在模式周围加了引号。在(f)lex中,双引号内的字符没有特殊意义;它们代表自己(除了 \ )

    flex manual 有关模式语法的详细信息。

    推荐文章