83 lines
2.1 KiB
Plaintext
83 lines
2.1 KiB
Plaintext
%{
|
||
#include "test.tab.h"
|
||
#include <stdio.h>
|
||
#include <string.h>
|
||
#include <stdlib.h>
|
||
|
||
extern int yylineno;
|
||
|
||
void yyerror(const char *s) {
|
||
fprintf(stderr, "\033[1;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;
|
||
} |