%{ #include "test.tab.h" #include #include #include extern int yylineno; void yyerror(const char *s) { fprintf(stderr, "\033[1;91mError at line %i: %s\033[0m\n", yylineno, s); exit(1); } %} EXPONENT [eE][+-]?{DIGIT}+ DIGIT [0-9] LETTER [a-zA-Z_] LETTER_OR_DIGIT [a-zA-Z0-9_] %% "string" { return STRING; } "bool" { return BOOL; } "uint" { return UINT; } "uint8" { return UINT8; } "uint16" { return UINT16; } "uint32" { return UINT32; } "uint64" { return UINT64; } "int" { return INT; } "int8" { return INT8; } "int16" { return INT16; } "int32" { return INT32; } "int64" { return INT64; } "complex64" { return COMPLEX64; } "complex128" { return COMPLEX128; } "byte" { return BYTE; } "rune" { return RUNE; } "float32" { return FLOAT32; } "float64" { return FLOAT64; } "uintptr" { return UINT_PTR; } "if" { return IF; } "else" { return ELSE; } "<-" { return ARROW; } "true" { return BOOL_LITERAL; } "false" { return BOOL_LITERAL; } "==" { return EQ; } "&&" { return AND; } "||" { return OR; } "!" { return NOT; } "!=" { return NEQ; } "<" { return LT; } ">" { return GT; } "<=" { return LEQ; } ">=" { return GEQ; } "+=" { return PLUS_EQ; } "-=" { return MINUS_EQ; } "*=" { return MUL_EQ; } "/=" { return DIV_EQ; } "%=" { return MOD_EQ; } "&=" { return AMPERSAND_EQ; } "|=" { return PIPE_EQ; } "^=" { return XOR_EQ; } "<<=" { return LSHIFT_EQ; } ">>=" { return RSHIFT_EQ; } "&^=" { return AND_NOT_EQ; } "++" { return INC; } "--" { return DEC; } "go" { return GO; } "defer" { return DEFER; } "range" { return RANGE; } "for" { return FOR; } "break" { return BREAK; } "switch" { return SWITCH; } "case" { return CASE; } "chan" { return CHAN; } "const" { return CONST; } "continue" { return CONTINUE; } "package" { return PACKAGE; } "import" { return IMPORT; } "var" { return VAR; } "func" { return FUNC; } "return" { return RETURN; } ":=" { return SHORT_DECLARATION; } "=" { return ASSIGN; } "+" { return PLUS; } "-" { return MINUS; } "*" { return MULT; } "/" { return DIV; } "%" { return MOD; } "{" { return LBRACE; } "}" { return RBRACE; } "(" { return LPAREN; } ")" { return RPAREN; } "," { return COMMA; } ";" { return SEMICOLON; } "..." { return DOTS; } ":" { return COLON; } "//" { int c; while ((c = input()) != '\n' && c != 0); if (c == '\n') yylineno++; } "/*" { int c, prev = 0; while ((c = input()) != 0) { if (c == '\n') yylineno++; if (prev == '*' && c == '/') break; prev = c; } if (c == 0) yyerror("Unterminated comment"); } \"([^"\\]|\\.)*\" { // правило для строк с возможность экранирования через \спецсимвол return STRING_LITERAL; } {LETTER}{LETTER_OR_DIGIT}*(\.{LETTER}{LETTER_OR_DIGIT}*)? { yylval.str = strdup(yytext); if (strchr(yytext, '.') != NULL) { return WITH_DOT_IDENTIFIER; } else { return IDENTIFIER; } } {DIGIT}+\.{DIGIT}*{EXPONENT}?i { yylval.str = strdup(yytext); return COMPLEX_LITERAL; } {DIGIT}+{EXPONENT}?i { yylval.str = strdup(yytext); return COMPLEX_LITERAL; } {DIGIT}+\.{DIGIT}*{EXPONENT}? { return FLOAT_LITERAL; } {DIGIT}+{EXPONENT} { return FLOAT_LITERAL; } {DIGIT}+ { return NUMBER; } [ \t\r]+ ; // Пропускаем пробелы и табы \n { yylineno++; } . { fprintf(stderr, "\033[91mUnexpected character at line %i: %c\033[0m\n", yylineno, yytext[0]); exit(1); } %% int yywrap() { return 1; }