go-analyzer/analyzers/test/test.l

168 lines
4.8 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

%{
#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);
}
%}
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; }
"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;
}