Как сопоставить пробелы и комментарии с re2c - PullRequest
0 голосов
/ 15 мая 2019

Я начал совсем недавно использовать bison для написания небольших упражнений компилятора.У меня проблемы с пробелами и комментариями.Я пытался отладить проблему, и я прибыл к этому источнику , который выглядит как то, что я ищу.Я пытался изменить и стереть некоторые символы в соответствии с рекомендациями, но ничего не вышло.Также во время компиляции у меня следующая ошибка: re2c: error: line 2963, column 0: can only difference char sets.Ниже приведена часть кода:

yy::conj_parser::symbol_type yy::yylex(lexcontext& ctx)
{
        const char* anchor = ctx.cursor;
        ctx.loc.step();
        // Add a lambda function to avoid repetition
        auto s = [&](auto func, auto&&... params) { ctx.loc.columns(ctx.cursor - anchor); return func(params..., ctx.loc); };

%{  /* Begin re2c lexer : Tokenization process starts */

re2c:yyfill:enable    = 0;
re2c:define:YYCTYPE   = "char";
re2c:define:YYCURSOR  = "ctx.cursor";

"return"          { return s(conj_parser::make_RETURN); }
"while" | "for"   { return s(conj_parser::make_WHILE);  }
"var"             { return s(conj_parser::make_VAR);    }
"if"              { return s(conj_parser::make_IF);     }

// Identifiers
[a-zA-Z_] [a-zA-Z_0-9]*  { return s(conj_parser::make_IDENTIFIER, std::string(anchor, ctx.cursor)); }

// String and integers:
"\""" [^\"]* "\""      { return s(conj_parser::make_STRINGCONST, std::string(anchor+1, ctx.cursor-1)); }
[0-9]+                 { return s(conj_parser::make_NUMCONST, std::stol(std::string(anchor, ctx.cursor))); }

// Whitespace and comments:
"\000"               { return s(conj_parser::make_END);      }
"\r\n" | [\r\n]      { ctx.loc.lines();   return yylex(ctx); }
"//" [^\r\n]*        {                    return yylex(ctx); }
[\t\v\b\f ]          { ctx.loc.columns(); return yylex(ctx); }

Большое спасибо за указание в правильном направлении или затенение некоторых индикаторов того, почему эта ошибка может быть устранена.

1 Ответ

1 голос
/ 15 мая 2019

Вы действительно должны упомянуть, какая строка является строкой 2963. Возможно, она здесь, потому что в этой строке, кажется, есть дополнительная кавычка.

"\""" [^\"]* "\""
    ^
...