【问题标题】:Flex error negative range in character class字符类中的 Flex 错误负范围
【发布时间】:2014-05-01 21:09:51
【问题描述】:

我正在使用 Flex 和 Bison 编写解析器,并将各种标记定义为:

[0-9]+          { yylval.str=strdup(yytext); return digit; }

[0-9]+\.[0-9]*      { yylval.str=strdup(yytext); return floating; }

[a-zA-Z_][a-zA-Z0-9_]*  { yylval.str=strdup(yytext);  return key; }

[a-zA-Z/][a-zA-Z_-/.]*  { yylval.str=strdup(yytext);  return string; }

[a-zA-Z0-9._-]+     { yylval.str=strdup(yytext);  return hostname; }

["][a-zA-Z0-9!@#$%^&*()_-+=.,/?]* { yylval.str=strdup(yytext);  return qstring1; }

[a-zA-Z0-9!@#$%^&*()_-+=.,/?]*["] { yylval.str=strdup(yytext);  return qstring2; }

[#].+           { yylval.str=strdup(yytext);  return comment;}

[ \n\t]         {} /* Ignore white space. */

.           {printf("ERR:L:%d\n", q); return ERROR;}

它在字符串、qstring1 和 qstring2 的正则表达式中显示错误“字符类中的负范围”。

有人可以帮我解决我哪里出错了吗?

规范是: 非引号字符串可能包含 ASCII 字母数字字符、下划线、连字符、正斜杠和句点,并且必须以字母或斜杠开头。

带引号的字符串可以在引号之间包含任何字母数字字符。

为了满足更多规范,我为引用字符串采用了两个不同的字符串。

谢谢。

【问题讨论】:

    标签: regex flex-lexer


    【解决方案1】:

    对于 (string, qstring1, qstring2),您需要将连字符 (-) 作为 firstlast 字符你的角色类 [] 或者只是简单地转义它 \- 如果在其他地方。

    • (字符串)

      [a-zA-Z/][a-zA-Z_./-]*
      
    • (qstring1)

      ["][a-zA-Z0-9!@#$%^&*()_+=.,/?-]*
      
    • (qstring2)

      [a-zA-Z0-9!@#$%^&*()_+=.,/?-]*["]
      

    【讨论】:

      【解决方案2】:

      - 需要用反斜杠转义。 对于 qstring1,请尝试以下操作:

      ["][a-zA-Z0-9!@#$%^&*()_\-+=.,/?]*
      

      【讨论】:

      • 斜线不需要转义。
      • 我猜这取决于正则表达式编译器。我在 Ruby 上测试过。
      • 仅取决于斜线是否用作分隔符,但斜线不是字符类内部或外部的特殊字符。
      【解决方案3】:

      我想在编写正则表达式时,您应该始终按照优先级顺序编写它:
      例如对于这行代码:
      [+-/*><=] {printf("Operator %c\n",yytext[0]); return yytext[0];} 不会给出任何错误。
      而 :
      [+-*/><=] {printf("Operator %c\n",yytext[0]); return yytext[0];} 将。
      希望有帮助。

      【讨论】:

      • 猜错了。第一个将给出与第二个相同的错误。不要在这里发布猜测。优先级与它无关。
      猜你喜欢
      • 1970-01-01
      • 2017-09-25
      • 1970-01-01
      • 2011-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-05
      相关资源
      最近更新 更多