【2025-11-16】现有代码上传
This commit is contained in:
210
mini_c.l
Normal file
210
mini_c.l
Normal file
@@ -0,0 +1,210 @@
|
||||
D [0-9]
|
||||
L [a-zA-Z_]
|
||||
H [a-fA-F0-9]
|
||||
E ([Ee][+-]?{D}+)
|
||||
P ([Pp][+-]?{D}+)
|
||||
FS (f|F|l|L)
|
||||
IS ((u|U)|(u|U)?(l|L|ll|LL)|(l|L|ll|LL)(u|U))
|
||||
|
||||
%option yylineno
|
||||
|
||||
|
||||
%{
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include "ast.h"
|
||||
#include "mini_c.tab.hpp"
|
||||
#define SET_SVAL yylval.sval = strdup(yytext)
|
||||
void count(void);
|
||||
|
||||
void comment(void);
|
||||
|
||||
int column = 0;
|
||||
int check_type(void);
|
||||
void error(const char*); /* 已在 .l 末尾实现 */
|
||||
|
||||
extern int yylineno;
|
||||
|
||||
#define YY_USER_ACTION \
|
||||
yylloc.first_line = yylineno; \
|
||||
yylloc.first_column = column; \
|
||||
yylloc.last_line = yylineno; \
|
||||
yylloc.last_column = column + yyleng - 1; \
|
||||
column += yyleng;
|
||||
|
||||
|
||||
|
||||
%}
|
||||
|
||||
|
||||
%%
|
||||
"/*" { comment(); }
|
||||
|
||||
|
||||
"auto" { count(); return(AUTO); }
|
||||
"_Bool" { count(); return(BOOL); }
|
||||
"break" { count(); return(BREAK); }
|
||||
"case" { count(); return(CASE); }
|
||||
"char" { count(); return(CHAR); }
|
||||
"_Complex" { count(); return(COMPLEX); }
|
||||
"const" { count(); return(CONST); }
|
||||
"continue" { count(); return(CONTINUE); }
|
||||
"default" { count(); return(DEFAULT); }
|
||||
"do" { count(); return(DO); }
|
||||
"double" { count(); return(DOUBLE); }
|
||||
"else" { count(); return(ELSE); }
|
||||
"enum" { count(); return(ENUM); }
|
||||
"extern" { count(); return(EXTERN); }
|
||||
"float" { count(); return(FLOAT); }
|
||||
"for" { count(); return(FOR); }
|
||||
"goto" { count(); return(GOTO); }
|
||||
"if" { count(); return(IF); }
|
||||
"_Imaginary" { count(); return(IMAGINARY); }
|
||||
"inline" { count(); return(INLINE); }
|
||||
"int" { count(); return(INT); }
|
||||
"long" { count(); return(LONG); }
|
||||
"register" { count(); return(REGISTER); }
|
||||
"restrict" { count(); return(RESTRICT); }
|
||||
"return" { count(); return(RETURN); }
|
||||
"short" { count(); return(SHORT); }
|
||||
"signed" { count(); return(SIGNED); }
|
||||
"sizeof" { count(); return(SIZEOF); }
|
||||
"static" { count(); return(STATIC); }
|
||||
"struct" { count(); return(STRUCT); }
|
||||
"switch" { count(); return(SWITCH); }
|
||||
"typedef" { count(); return(TYPEDEF); }
|
||||
"union" { count(); return(UNION); }
|
||||
"unsigned" { count(); return(UNSIGNED); }
|
||||
"void" { count(); return(VOID); }
|
||||
"volatile" { count(); return(VOLATILE); }
|
||||
"while" { count(); return(WHILE); }
|
||||
|
||||
{L}({L}|{D})* { count(); SET_SVAL; return(check_type()); }
|
||||
|
||||
0[xX]{H}+{IS}? { count(); SET_SVAL; return(CONSTANT); }
|
||||
0[0-7]*{IS}? { count(); SET_SVAL; return(CONSTANT); }
|
||||
[1-9]{D}*{IS}? { count(); SET_SVAL; return(CONSTANT); }
|
||||
L?'((\\.)|[^\\'\n])+' { count(); SET_SVAL; return(CONSTANT); }
|
||||
|
||||
{D}+{E}{FS}? { count(); SET_SVAL; return(CONSTANT); }
|
||||
{D}*\.{D}+{E}?{FS}? { count(); SET_SVAL; return(CONSTANT); }
|
||||
{D}+\.{D}*{E}?{FS}? { count(); SET_SVAL; return(CONSTANT); }
|
||||
0[xX]{H}+{P}{FS}? { count(); SET_SVAL; return(CONSTANT); }
|
||||
0[xX]{H}*\.{H}+{P}?{FS}? { count(); SET_SVAL; return(CONSTANT); }
|
||||
0[xX]{H}+\.{H}*{P}?{FS}? { count(); SET_SVAL; return(CONSTANT); }
|
||||
|
||||
|
||||
L?\"((\\.)|[^\\"\n])*\" { count(); SET_SVAL; return(STRING_LITERAL); }
|
||||
|
||||
"..." { count(); return(ELLIPSIS); }
|
||||
">>=" { count(); return(RIGHT_ASSIGN); }
|
||||
"<<=" { count(); return(LEFT_ASSIGN); }
|
||||
"+=" { count(); return(ADD_ASSIGN); }
|
||||
"-=" { count(); return(SUB_ASSIGN); }
|
||||
"*=" { count(); return(MUL_ASSIGN); }
|
||||
"/=" { count(); return(DIV_ASSIGN); }
|
||||
"%=" { count(); return(MOD_ASSIGN); }
|
||||
"&=" { count(); return(AND_ASSIGN); }
|
||||
"^=" { count(); return(XOR_ASSIGN); }
|
||||
"|=" { count(); return(OR_ASSIGN); }
|
||||
">>" { count(); return(RIGHT_OP); }
|
||||
"<<" { count(); return(LEFT_OP); }
|
||||
"++" { count(); return(INC_OP); }
|
||||
"--" { count(); return(DEC_OP); }
|
||||
"->" { count(); return(PTR_OP); }
|
||||
"&&" { count(); return(AND_OP); }
|
||||
"||" { count(); return(OR_OP); }
|
||||
"<=" { count(); return(LE_OP); }
|
||||
">=" { count(); return(GE_OP); }
|
||||
"==" { count(); return(EQ_OP); }
|
||||
"!=" { count(); return(NE_OP); }
|
||||
";" { count(); return(';'); }
|
||||
(\{|<%) { count(); return('{'); }
|
||||
(\}|%>) { count(); return('}'); }
|
||||
"," { count(); return(','); }
|
||||
":" { count(); return(':'); }
|
||||
"=" { count(); return('='); }
|
||||
"(" { count(); return('('); }
|
||||
")" { count(); return(')'); }
|
||||
(\[|<:) { count(); return('['); }
|
||||
(\]|:>) { count(); return(']'); }
|
||||
"." { count(); return('.'); }
|
||||
"&" { count(); return('&'); }
|
||||
"!" { count(); return('!'); }
|
||||
"~" { count(); return('~'); }
|
||||
"-" { count(); return('-'); }
|
||||
"+" { count(); return('+'); }
|
||||
"*" { count(); return('*'); }
|
||||
"/" { count(); return('/'); }
|
||||
"%" { count(); return('%'); }
|
||||
"<" { count(); return('<'); }
|
||||
">" { count(); return('>'); }
|
||||
"^" { count(); return('^'); }
|
||||
"|" { count(); return('|'); }
|
||||
"?" { count(); return('?'); }
|
||||
|
||||
[\p\t\v\n\f] { count(); }
|
||||
. { /* Add code to complain about unmatched characters */ }
|
||||
|
||||
%%
|
||||
|
||||
int yywrap(void)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
void comment(void)
|
||||
{
|
||||
char c, prev = 0;
|
||||
|
||||
while ((c = yyinput()) != 0) /* (EOF maps to 0) */
|
||||
{
|
||||
if (c == '/' && prev == '*')
|
||||
return;
|
||||
prev = c;
|
||||
}
|
||||
error("unterminated comment");
|
||||
}
|
||||
|
||||
|
||||
/* int column = 0; */
|
||||
|
||||
void count(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; yytext[i] != '\0'; i++)
|
||||
if (yytext[i] == '\n')
|
||||
{
|
||||
column = 0;
|
||||
}
|
||||
else if (yytext[i] == '\t')
|
||||
{
|
||||
column += 8 - (column % 8);
|
||||
}
|
||||
else
|
||||
{
|
||||
column++;
|
||||
}
|
||||
ECHO;
|
||||
}
|
||||
|
||||
|
||||
int check_type(void)
|
||||
{
|
||||
/*
|
||||
* pseudo code --- this is what it should check
|
||||
*
|
||||
* if (yytext == type_name)
|
||||
* return TYPE_NAME;
|
||||
*
|
||||
* return IDENTIFIER;
|
||||
*/
|
||||
|
||||
/*
|
||||
* it actually will only return IDENTIFIER
|
||||
*/
|
||||
|
||||
return IDENTIFIER;
|
||||
}
|
||||
Reference in New Issue
Block a user