%{ #include "test.tab.h" #include #include #include extern int yylineno; void yyerror(const char *s) { fprintf(stderr, "\033[91mError at line %i: %s\033[0m\n", yylineno, s); exit(1); } %} DIGIT [0-9] LETTER [a-zA-Z_] LETTER_OR_DIGIT [a-zA-Z0-9_] %% "string" { return STRING; } "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; } "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 STRING_LITERAL; } {LETTER}{LETTER_OR_DIGIT}* { yylval.str = strdup(yytext); return IDENTIFIER; } [0-9]+\.[0-9]+ { 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; }