145 lines
4.2 KiB
Plaintext
145 lines
4.2 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; }
|
||
"complex64" { return COMPLEX64; }
|
||
"complex128" { return COMPLEX128; }
|
||
"byte" { return BYTE; }
|
||
"rune" { return RUNE; }
|
||
"float32" { return FLOAT32; }
|
||
"float64" { return FLOAT64; }
|
||
"uintptr" { return UINT_PTR; }
|
||
"true" { return BOOL_LITERAL; }
|
||
"false" { return BOOL_LITERAL; }
|
||
"if" { return IF; }
|
||
"else" { return ELSE; }
|
||
"<-" { return ARROW; }
|
||
|
||
"==" { 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; }
|
||
|
||
"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}* {
|
||
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;
|
||
} |