Синтаксическая ошибка Flex/Flex++ - "Нераспознанное правило"

Я пишу грамматику, используя Flex++ для генерации парсера, и этот блок кода всегда возвращает ошибку "нераспознанное правило".

%{
#include "Parserbase.h"
%}

%option noyywrap

num         [0-9]+
float       [0-9]+"."[0-9]+
comment     [["//"[.]*\n] | ["/\*"[.]*"\*/"]]
varname     [a-zA-Z][a-zA-Z0-9_]*

%%


";"             {return ParserBase::SEMICOLON;}
"\n"            {return ParserBase::ENDLINE;}

"int"           {return ParserBase::INT;}
"="             {return ParserBase::EQUALS;}
{num}           {return ParserBase::NUM;}
{comment}       {return ParserBase::COMMENT;}
{varname}       {return ParserBase::VARNAME;}

Это всегда возвращает следующее:

bisonc++ Compiler.y
[Warning] Terminal symbol(s) not used in productions:
257: NUM
261: ENDLINE
g++ -c parse.cc
flex++ Compiler.l
Compiler.l:21: unrecognised rule
make: *** [lex.yy.cc] Error 1

Я пытался обойти правила, изменив псевдоним на простой [a-zA-Z] или даже просто [az] Все безрезультатно, и это сводит меня с ума... У кого-нибудь есть идеи? Спасибо!

1 ответ

Решение

Это определение недопустимо:

comment     [["//"[.]*\n] | ["/\*"[.]*"\*/"]]

[ а также ( разные. [...] класс персонажа; то есть список возможных символов, которые будут соответствовать одному символу. (...) используется для группировки регулярных выражений.

Кроме того, я не верю, что вы можете вставить произвольные пробелы в регулярное выражение Flex++.

Поэтому я думаю, что вы хотели:

comment     ("//".*\n|"/*".*"*/")

Здесь я удалил неправильные квадратные скобки, изменил те, которые использовались для группировки в круглые скобки, и удалил ненужную группировку вокруг альтернатив, так как | имеет более низкий приоритет, чем конкатенация. Я также удалил ненужные обратные слэши, так как цитирование достаточно, чтобы сделать * в характер.

Однако это не будет правильно соответствовать комментариям C++:

Первый, .* является жадным (то есть, он будет соответствовать самой длинной возможной строке), так

/* A comment */ a = 3; /* Another comment */

будет неправильно распознан как один комментарий.

Во-вторых, . не соответствует символу новой строки. Так многолинейно /* ... */ комментарии не будут совпадать, потому что .* не доходит до конца комментария, только до конца строки.

Другие вопросы по тегам