compilers-lab1/scanner.l

188 lines
3.7 KiB
Text
Raw Permalink Normal View History

2025-03-24 18:40:16 +08:00
%{
#include "parser.tab.h"
#include "node.h"
#include <stdio.h>
#include <stdlib.h>
extern int errors;
%}
%option yylineno
DEC_DIGIT [0-9]
HEX_DIGIT [0-9a-fA-F]
OCT_DIGIT [0-8]
DEC_INTEGER [+-]?(0|[1-9]{DEC_DIGIT}*)
HEX_INTEGER [+-]?0[xX]{HEX_DIGIT}+
OCT_INTEGER [+-]?0{OCT_DIGIT}+
FLOAT [+-]?{DEC_DIGIT}*\.{DEC_DIGIT}+([eE][-+]?{DEC_DIGIT}+)?
NEWLINE (\n|\r\n)
WHITE_SPACE [ \t]
SEMI ";"
COMMA ","
ASSIGNOP "="
PLUS "+"
MINUS "-"
TIMES "*"
DIV "/"
AND "&&"
OR "||"
DOT "."
NOT "!"
LP "("
RP ")"
LB "["
RB "]"
LC "{"
RC "}"
STRUCT "struct"
RETURN "return"
IF "if"
ELSE "else"
WHILE "while"
TYPE_INT "int"
TYPE_FLOAT "float"
ID [a-zA-Z_][a-zA-Z0-9_]*
LINE_COMMENT \/\/.*$
BLOCK_COMMENT \/\*(.|\n)*?\*\/
%%
{SEMI} {
yylval = newNode(Semi, yylineno, 0, NULL, nullValue());
return SEMI;
}
{COMMA} {
yylval = newNode(Comma, yylineno, 0, NULL, nullValue());
return COMMA;
}
{ASSIGNOP} {
yylval = newNode(Assignop, yylineno, 0, NULL, nullValue());
return ASSIGNOP;
}
{PLUS} {
yylval = newNode(Plus, yylineno, 0, NULL, nullValue());
return PLUS;
}
{MINUS} {
yylval = newNode(Minus, yylineno, 0, NULL, nullValue());
return MINUS;
}
{TIMES} {
yylval = newNode(Times, yylineno, 0, NULL, nullValue());
return TIMES;
}
{DIV} {
yylval = newNode(Div, yylineno, 0, NULL, nullValue());
return DIV;
}
{AND} {
yylval = newNode(And, yylineno, 0, NULL, nullValue());
return AND;
}
{OR} {
yylval = newNode(Or, yylineno, 0, NULL, nullValue());
return OR;
}
{DOT} {
yylval = newNode(Dot, yylineno, 0, NULL, nullValue());
return DOT;
}
{NOT} {
yylval = newNode(Not, yylineno, 0, NULL, nullValue());
return NOT;
}
{LP} {
yylval = newNode(Lp, yylineno, 0, NULL, nullValue());
return LP;
}
{RP} {
yylval = newNode(Rp, yylineno, 0, NULL, nullValue());
return RP;
}
{LB} {
yylval = newNode(Lb, yylineno, 0, NULL, nullValue());
return LB;
}
{RB} {
yylval = newNode(Rb, yylineno, 0, NULL, nullValue());
return RB;
}
{LC} {
yylval = newNode(Lc, yylineno, 0, NULL, nullValue());
return LC;
}
{RC} {
yylval = newNode(Rc, yylineno, 0, NULL, nullValue());
return RC;
}
{STRUCT} {
yylval = newNode(Struct, yylineno, 0, NULL, nullValue());
return STRUCT;
}
{RETURN} {
yylval = newNode(Return, yylineno, 0, NULL, nullValue());
return RETURN;
}
{IF} {
yylval = newNode(If, yylineno, 0, NULL, nullValue());
return IF;
}
{ELSE} {
yylval = newNode(Else, yylineno, 0, NULL, nullValue());
return ELSE;
}
{WHILE} {
yylval = newNode(While, yylineno, 0, NULL, nullValue());
return WHILE;
}
{TYPE_INT} {
yylval = newNode(Type_int, yylineno, 0, NULL, nullValue());
return TYPE_INT;
}
{TYPE_FLOAT} {
yylval = newNode(Type_float, yylineno, 0, NULL, nullValue());
return TYPE_FLOAT;
}
{DEC_INTEGER} {
ValueUnion value = { .integer = strtol(yytext, NULL, 10) };
yylval = newNode(Integer, yylineno, 0, NULL, value);
return INTEGER;
}
{HEX_INTEGER} {
ValueUnion value = { .integer = strtol(yytext, NULL, 16) };
yylval = newNode(Integer, yylineno, 0, NULL, value);
return INTEGER;
}
{OCT_INTEGER} {
ValueUnion value = { .integer = strtol(yytext, NULL, 8) };
yylval = newNode(Integer, yylineno, 0, NULL, value);
return INTEGER;
}
{FLOAT} {
ValueUnion value = { .real = atof(yytext) };
yylval = newNode(Float, yylineno, 0, NULL, value);
return FLOAT;
}
{ID} {
char* id = (char*)calloc(sizeof(char), yyleng + 1);
strcpy(id, yytext);
ValueUnion value = { .id = id };
yylval = newNode(Ident, yylineno, 0, NULL, value);
return ID;
}
{LINE_COMMENT} {
yylval = newNode(Line_comment, yylineno, 0, NULL, nullValue());
return LINE_COMMENT;
}
{BLOCK_COMMENT} {
yylval = newNode(Block_comment, yylineno, 0, NULL, nullValue());
return BLOCK_COMMENT;
}
{NEWLINE}|{WHITE_SPACE} {}
. {
errors += 1;
fprintf(stderr, "Error type A at Line %d: Mysterious character \"%s\".\n", yylineno, yytext);
}
%%