188 lines
3.7 KiB
Text
188 lines
3.7 KiB
Text
|
|
%{
|
||
|
|
#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);
|
||
|
|
}
|
||
|
|
%%
|
||
|
|
|