deepseek lex
parent
433de4d309
commit
f4a88eb215
|
@ -0,0 +1,151 @@
|
|||
%{
|
||||
#include <stdio.h>
|
||||
#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);
|
||||
}
|
Loading…
Reference in New Issue