%{ #include #include "y.tab.h" // Заголовочный файл, генерируемый Bison %} %option noyywrap %option yylineno DIGIT [0-9] LETTER [a-zA-Z_] HEX [0-9a-fA-F] OCT [0-7] BIN [0-1] EXP [eE][+-]?{DIGIT}+ FLOAT_SUFF [fF] %% /* Ключевые слова */ "break" { return BREAK; } "case" { return CASE; } "chan" { return CHAN; } "const" { return CONST; } "continue" { return CONTINUE; } "default" { return DEFAULT; } "defer" { return DEFER; } "else" { return ELSE; } "fallthrough" { return FALLTHROUGH; } "for" { return FOR; } "func" { return FUNC; } "go" { return GO; } "goto" { return GOTO; } "if" { return IF; } "import" { return IMPORT; } "interface" { return INTERFACE; } "map" { return MAP; } "package" { return PACKAGE; } "range" { return RANGE; } "return" { return RETURN; } "select" { return SELECT; } "struct" { return STRUCT; } "switch" { return SWITCH; } "type" { return TYPE; } "var" { return VAR; } /* Предопределенные идентификаторы */ "true" { yylval.bool_val = true; return BOOL_LIT; } "false" { yylval.bool_val = false; return BOOL_LIT; } "nil" { return NIL; } /* Идентификаторы */ {LETTER}({LETTER}|{DIGIT})* { yylval.str_val = strdup(yytext); return IDENT; } /* Целочисленные литералы */ 0[xX]{HEX}+ { yylval.int_val = strtol(yytext, NULL, 16); return INT_LIT; } 0[oO]?{OCT}+ { yylval.int_val = strtol(yytext, NULL, 8); return INT_LIT; } 0[bB]{BIN}+ { yylval.int_val = strtol(yytext, NULL, 2); return INT_LIT; } {DIGIT}+ { yylval.int_val = atoi(yytext); return INT_LIT; } /* Вещественные литералы */ {DIGIT}+{EXP} { yylval.float_val = atof(yytext); return FLOAT_LIT; } {DIGIT}+"."{DIGIT}*{EXP}? { yylval.float_val = atof(yytext); return FLOAT_LIT; } {DIGIT}+"."{DIGIT}*{EXP}?{FLOAT_SUFF} { yylval.float_val = atof(yytext); return FLOAT_LIT; } /* Строковые литералы */ \"(\\.|[^\\"])*\" { yylval.str_val = strdup(yytext); return STRING_LIT; } `[^`]*` { yylval.str_val = strdup(yytext); return RAW_STRING_LIT; } /* Руны */ '(\\.|[^\\'])' { yylval.rune_val = yytext[1]; return RUNE_LIT; } /* Операторы */ "+" { return PLUS; } "-" { return MINUS; } "*" { return STAR; } "/" { return SLASH; } "%" { return PERCENT; } "&" { return AMPERSAND; } "|" { return PIPE; } "^" { return CARET; } "<<" { return LSHIFT; } ">>" { return RSHIFT; } "&^" { return AMPERSAND_CARET; } "+=" { return PLUS_EQ; } "-=" { return MINUS_EQ; } "*=" { return STAR_EQ; } "/=" { return SLASH_EQ; } "%=" { return PERCENT_EQ; } "&=" { return AMPERSAND_EQ; } "|=" { return PIPE_EQ; } "^=" { return CARET_EQ; } "<<=" { return LSHIFT_EQ; } ">>=" { return RSHIFT_EQ; } "&^=" { return AMPERSAND_CARET_EQ; } "&&" { return LAND; } "||" { return LOR; } "<-" { return ARROW; } "++" { return INC; } "--" { return DEC; } "==" { return EQ; } "<" { return LT; } ">" { return GT; } "=" { return ASSIGN; } "!" { return NOT; } "!=" { return NEQ; } "<=" { return LEQ; } ">=" { return GEQ; } ":=" { return DECLARE_ASSIGN; } "..." { return ELLIPSIS; } ":" { return COLON; } ";" { return SEMICOLON; } "," { return COMMA; } "." { return DOT; } /* Скобки и разделители */ "(" { return LPAREN; } ")" { return RPAREN; } "[" { return LBRACK; } "]" { return RBRACK; } "{" { return LBRACE; } "}" { return RBRACE; } /* Комментарии */ "//".* { /* Игнорируем однострочные комментарии */ } "/\*"(.|\n)*?"\*/" { /* Игнорируем многострочные комментарии */ } /* Пробельные символы */ [ \t\n\r]+ { /* Игнорируем пробелы, табы, переводы строк */ } /* Ошибка */ . { fprintf(stderr, "Неизвестный символ: %s\n", yytext); } %% /* Дополнительные функции */ void yyerror(const char *s) { fprintf(stderr, "Ошибка лексического анализа: %s\n", s); }