diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..1b1b18d --- /dev/null +++ b/Makefile @@ -0,0 +1,19 @@ +LEX = flex +YACC = bison -d +CC = gcc + +compilateur: as.tab.c lex.yy.c + $(CC) -o compilateur as.tab.c lex.yy.c + +as.tab.c: as.y + $(YACC) as.y + + +lex.yy.c: al.lex + $(LEX) al.lex + + +build: compilateur + +clean: + rm as.tab.c as.tab.h lex.yy.c compilateur diff --git a/al.lex b/al.lex new file mode 100644 index 0000000..15059e5 --- /dev/null +++ b/al.lex @@ -0,0 +1,54 @@ +%{ +#include "as.tab.h" +%} + +D [0-9] + +%% + +{D}+(e{D}+)? { + yylval.nombre = atoi(yytext); + return tNB; + } + +"+" { return tADD; } +"-" { return tSUB; } +"*" { return tMUL; } +"/" { return tDIV; } +"=" { return tEQ; } +"(" { return tPO; } +")" { return tPF; } +";" { return tPV; } +"," { return tVIRG; } +"{" { return tAO; } +"}" { return tAF; } +"!" { return tNOT; } +"==" { return tEQ2; } +"!=" { return tNOTEQ; } +"<" { return tINF; } +"<=" { return tINFEQ; } +">" { return tSUP; } +">=" { return tSUPEQ; } +"&&" { return tAND; } +"||" { return tOR; } +[ \t\n]+ { } + +"int" { return tINT; } +"const" { return tCONST; } +"main" { return tMAIN; } +"if" { return tIF; } +"else" { return tELSE; } +"elsif" { return tELSIF; } +"while" { return tWHILE; } +"printf" { return tPRINTF; } +[a-zA-Z][a-zA-Z0-9_]* { return tID; } + +%% + +int yywrap() { + return 1; +} +// int main () { +// yylex(); +// return 1; +// } diff --git a/as.y b/as.y new file mode 100644 index 0000000..6da3010 --- /dev/null +++ b/as.y @@ -0,0 +1,115 @@ +%{ +#include "stdio.h" +#include "stdlib.h" +%} + +%union { + int nombre; +} + +%token tNB +%token tADD +%token tSUB +%token tMUL +%token tDIV +%token tPO +%token tPF +%token tPV +%token tVIRG +%token tAO +%token tAF +%token tEQ +%token tEQ2 +%token tNOTEQ +%token tNOT +%token tINF +%token tINFEQ +%token tSUP +%token tSUPEQ +%token tAND +%token tOR + +%token tINT +%token tCONST +%token tMAIN +%token tIF +%token tELSE +%token tELSIF +%token tWHILE +%token tPRINTF +%token tID + +%left tADD +%left tSUB +%left tMUL +%left tDIV +// %type E + +%% + +S : Main ; + +Main : tINT tMAIN tPO Params tPF Body ; + +Params : | Param SuiteParams ; +Param : tINT tID ; + +SuiteParams : tVIRG Param SuiteParams ; + +Body : tAO Instructions tAF ; + +Instructions : Instruction Instructions | ; + +Instruction : Aff | Printf | If ; + +Aff : tID tEQ E tPV ; + +E : tNB | tID | E tADD E | E tMUL E | E tSUB E | E tDIV E | tPO E tPF | tSUB E ; + + +If : IfSimple | IfElse ; + +IfSimple : tIF tPO Cond tPF Body ; + +IfElse : IfSimple tELSE Body ; + +Cond : Cond tAND Cond | Cond tOR Cond | E tEQ2 E | E tINF E | E tINFEQ E | E tSUP E | E tSUPEQ E | E tNOTEQ E | tNOT Cond | tNOT tPO Cond tPF ; + +Printf : tPRINTF tPO tID tPF tPV + +// If : tIF tPO Cond tPF Body ; +// +// Cond : Cond tAND Cond | Cond tOR Cond | E tEQ2 E | E tINF E | tNOT Cond ; + +// Invocation : tID tPO Args tPF ; + +// Args : .... cf params + +// Return : tRET E tPV ; + + +/* S -> E ; S + * S -> + */ +// S : E tPV +// { printf("RES: %d\n", $1); } +// S +// | { printf("END\n"); } +// ; +// +// E : E tADD E { $$ = $1 + $3; } +// | E tSUB E { $$ = $1 - $3; } +// | tOB E tCB { $$ = $2; } +// | tNB { $$ = $1; } +// ; + +%% + +void yyerror(char const* err) { + printf("%s\n", err); + exit(1); +} + +void main(void) { + yyparse(); +} diff --git a/test.c b/test.c new file mode 100644 index 0000000..3550380 --- /dev/null +++ b/test.c @@ -0,0 +1,7 @@ +int main(){ + x = 3 + 6; + printf(x); + if (x == x && y != 5 + 6 || 1 + 2 == 2 + 1 && !(x == x)) { + printf(x); + } +}