Отрицательный диапазон ошибок Flex в классе символов

Я пишу синтаксический анализатор с использованием 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, знаки подчеркивания, дефисы, косую черту и точку и должны начинаться с буквы или косой черты.

Строки в кавычках могут содержать любой буквенно-цифровой символ между кавычками.

Я взял две разные строки для строк в кавычках, чтобы выполнить еще несколько спецификаций.

Спасибо.


person user3435894    schedule 01.05.2014    source источник


Ответы (3)


Для (string, qstring1, qstring2) вам нужно либо поместить дефис (-) в качестве первого или последнего символа вашего класса символов [], либо просто экранировать его \-, если в другом месте.

  • (нить)

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

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

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

- нужно экранировать обратной косой чертой. Для qstring1 попробуйте следующее:

["][a-zA-Z0-9!@#$%^&*()_\-+=.,/?]*
person Calvin    schedule 01.05.2014
comment
Косую черту не нужно экранировать. - person Casimir et Hippolyte; 02.05.2014
comment
Я думаю, это зависит от компилятора регулярных выражений. Я тестировал его на Руби. - person Calvin; 02.05.2014
comment
Это зависит только от того, используется ли косая черта в качестве разделителя, но косая черта не является специальным символом внутри или вне класса символов. - person Casimir et Hippolyte; 02.05.2014

Я предполагаю, что при написании регулярного выражения вы всегда должны писать его в порядке приоритета:
например, для этой строки кода:
[+-/*><=] {printf("Operator %c\n",yytext[0]); return yytext[0];} не выдаст никакой ошибки.
тогда как :
[+-*/><=] {printf("Operator %c\n",yytext[0]); return yytext[0];} выдаст.
Надеюсь, это поможет.

person manask322    schedule 16.09.2018