字符类中的Flex错误负范围

问题描述 投票:2回答:3

我正在使用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
3个回答
3
投票

对于(stringqstring1qstring2),你需要将连字符(-)作为你的角色类[]的第一个或最后一个字符,或者只是简单地将其移除\-(如果在其他地方)。

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

2
投票

-需要以反斜杠进行逃脱。对于qstring1,请尝试以下操作:

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

0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.