From f4a88eb2159c8b9d30f72f3c660a90478e7b66e6 Mon Sep 17 00:00:00 2001 From: melentev_i Date: Tue, 22 Apr 2025 15:30:14 +0300 Subject: [PATCH] deepseek lex --- analyzers/test/lex.l | 151 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 151 insertions(+) create mode 100644 analyzers/test/lex.l diff --git a/analyzers/test/lex.l b/analyzers/test/lex.l new file mode 100644 index 0000000..5e2182f --- /dev/null +++ b/analyzers/test/lex.l @@ -0,0 +1,151 @@ +%{ +#include +#include "y.tab.h" // Заголовочный файл, генерируемый Bison +%} + +%option noyywrap +%option yylineno + +DIGIT [0-9] +LETTER [a-zA-Z_] +HEX [0-9a-fA-F] +OCT [0-7] +BIN [0-1] +EXP [eE][+-]?{DIGIT}+ +FLOAT_SUFF [fF] + +%% + +/* Ключевые слова */ +"break" { return BREAK; } +"case" { return CASE; } +"chan" { return CHAN; } +"const" { return CONST; } +"continue" { return CONTINUE; } +"default" { return DEFAULT; } +"defer" { return DEFER; } +"else" { return ELSE; } +"fallthrough" { return FALLTHROUGH; } +"for" { return FOR; } +"func" { return FUNC; } +"go" { return GO; } +"goto" { return GOTO; } +"if" { return IF; } +"import" { return IMPORT; } +"interface" { return INTERFACE; } +"map" { return MAP; } +"package" { return PACKAGE; } +"range" { return RANGE; } +"return" { return RETURN; } +"select" { return SELECT; } +"struct" { return STRUCT; } +"switch" { return SWITCH; } +"type" { return TYPE; } +"var" { return VAR; } + +/* Предопределенные идентификаторы */ +"true" { yylval.bool_val = true; return BOOL_LIT; } +"false" { yylval.bool_val = false; return BOOL_LIT; } +"nil" { return NIL; } + +/* Идентификаторы */ +{LETTER}({LETTER}|{DIGIT})* { + yylval.str_val = strdup(yytext); + return IDENT; +} + +/* Целочисленные литералы */ +0[xX]{HEX}+ { yylval.int_val = strtol(yytext, NULL, 16); return INT_LIT; } +0[oO]?{OCT}+ { yylval.int_val = strtol(yytext, NULL, 8); return INT_LIT; } +0[bB]{BIN}+ { yylval.int_val = strtol(yytext, NULL, 2); return INT_LIT; } +{DIGIT}+ { yylval.int_val = atoi(yytext); return INT_LIT; } + +/* Вещественные литералы */ +{DIGIT}+{EXP} { yylval.float_val = atof(yytext); return FLOAT_LIT; } +{DIGIT}+"."{DIGIT}*{EXP}? { yylval.float_val = atof(yytext); return FLOAT_LIT; } +{DIGIT}+"."{DIGIT}*{EXP}?{FLOAT_SUFF} { yylval.float_val = atof(yytext); return FLOAT_LIT; } + +/* Строковые литералы */ +\"(\\.|[^\\"])*\" { + yylval.str_val = strdup(yytext); + return STRING_LIT; +} + +`[^`]*` { + yylval.str_val = strdup(yytext); + return RAW_STRING_LIT; +} + +/* Руны */ +'(\\.|[^\\'])' { + yylval.rune_val = yytext[1]; + return RUNE_LIT; +} + +/* Операторы */ +"+" { return PLUS; } +"-" { return MINUS; } +"*" { return STAR; } +"/" { return SLASH; } +"%" { return PERCENT; } +"&" { return AMPERSAND; } +"|" { return PIPE; } +"^" { return CARET; } +"<<" { return LSHIFT; } +">>" { return RSHIFT; } +"&^" { return AMPERSAND_CARET; } +"+=" { return PLUS_EQ; } +"-=" { return MINUS_EQ; } +"*=" { return STAR_EQ; } +"/=" { return SLASH_EQ; } +"%=" { return PERCENT_EQ; } +"&=" { return AMPERSAND_EQ; } +"|=" { return PIPE_EQ; } +"^=" { return CARET_EQ; } +"<<=" { return LSHIFT_EQ; } +">>=" { return RSHIFT_EQ; } +"&^=" { return AMPERSAND_CARET_EQ; } +"&&" { return LAND; } +"||" { return LOR; } +"<-" { return ARROW; } +"++" { return INC; } +"--" { return DEC; } +"==" { return EQ; } +"<" { return LT; } +">" { return GT; } +"=" { return ASSIGN; } +"!" { return NOT; } +"!=" { return NEQ; } +"<=" { return LEQ; } +">=" { return GEQ; } +":=" { return DECLARE_ASSIGN; } +"..." { return ELLIPSIS; } +":" { return COLON; } +";" { return SEMICOLON; } +"," { return COMMA; } +"." { return DOT; } + +/* Скобки и разделители */ +"(" { return LPAREN; } +")" { return RPAREN; } +"[" { return LBRACK; } +"]" { return RBRACK; } +"{" { return LBRACE; } +"}" { return RBRACE; } + +/* Комментарии */ +"//".* { /* Игнорируем однострочные комментарии */ } +"/\*"(.|\n)*?"\*/" { /* Игнорируем многострочные комментарии */ } + +/* Пробельные символы */ +[ \t\n\r]+ { /* Игнорируем пробелы, табы, переводы строк */ } + +/* Ошибка */ +. { fprintf(stderr, "Неизвестный символ: %s\n", yytext); } + +%% + +/* Дополнительные функции */ +void yyerror(const char *s) { + fprintf(stderr, "Ошибка лексического анализа: %s\n", s); +} \ No newline at end of file