First draft
This commit is contained in:
parent
63975af86f
commit
6e00634d28
4 changed files with 195 additions and 0 deletions
19
Makefile
Normal file
19
Makefile
Normal file
|
@ -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
|
54
al.lex
Normal file
54
al.lex
Normal file
|
@ -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;
|
||||||
|
// }
|
115
as.y
Normal file
115
as.y
Normal file
|
@ -0,0 +1,115 @@
|
||||||
|
%{
|
||||||
|
#include "stdio.h"
|
||||||
|
#include "stdlib.h"
|
||||||
|
%}
|
||||||
|
|
||||||
|
%union {
|
||||||
|
int nombre;
|
||||||
|
}
|
||||||
|
|
||||||
|
%token<nombre> 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<nombre> 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();
|
||||||
|
}
|
7
test.c
Normal file
7
test.c
Normal file
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue