我正在使用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字母数字字符,下划线,连字符,正斜杠和句点,并且必须以字母或斜杠开头。
带引号的字符串可以在引号之间包含任何字母数字字符。
我为引用的字符串采用了两个不同的字符串,以满足更多规范。
谢谢。
对于(string
,qstring1
,qstring2
),你需要将连字符(-
)作为你的角色类[]
的第一个或最后一个字符,或者只是简单地将其移除\-
(如果在其他地方)。
[a-zA-Z/][a-zA-Z_./-]*
["][a-zA-Z0-9!@#$%^&*()_+=.,/?-]*
[a-zA-Z0-9!@#$%^&*()_+=.,/?-]*["]
-
需要以反斜杠进行逃脱。对于qstring1,请尝试以下操作:
["][a-zA-Z0-9!@#$%^&*()_\-+=.,/?]*
我想在编写正则表达式时,你应该总是用它的优先级顺序写它:
例如,这行代码:
[+-/*><=] {printf("Operator %c\n",yytext[0]); return yytext[0];}
不会给出任何错误。
而:
[+-*/><=] {printf("Operator %c\n",yytext[0]); return yytext[0];}
将。
希望能帮助到你。