feat: ajout de la grammaire correspondant aux pointeurs

This commit is contained in:
Laurent Fainsin 2021-12-11 15:01:38 +01:00
parent ba9e13e5b8
commit fba95515fe
3 changed files with 33 additions and 107 deletions

View file

@ -29,7 +29,9 @@
"denom", DENOM; "denom", DENOM;
"true", TRUE; "true", TRUE;
"false", FALSE; "false", FALSE;
"return", RETURN "return", RETURN;
"null", NULL;
"new", NEW;
]; ];
fun id -> fun id ->
match Hashtbl.find_opt kws id with match Hashtbl.find_opt kws id with
@ -38,10 +40,13 @@
} }
rule token = parse rule token = parse
(* ignore les sauts de lignes mais les compte quand même *) (* ignore les sauts de lignes mais les compte quand même *)
| '\n' { new_line lexbuf; token lexbuf } | '\n' { new_line lexbuf; token lexbuf }
(* ignore les espaces et tabulations *) (* ignore les espaces et tabulations *)
| [' ' '\t'] { token lexbuf } | [' ' '\t'] { token lexbuf }
(* ignore les commentaires *) (* ignore les commentaires *)
| "//"[^'\n']* { token lexbuf } | "//"[^'\n']* { token lexbuf }
@ -58,15 +63,16 @@ rule token = parse
| "+" { PLUS } | "+" { PLUS }
| "*" { MULT } | "*" { MULT }
| "<" { INF } | "<" { INF }
| "&" { AMP }
(* constantes entières *) (* constantes entières *)
| ("-")?['0'-'9']+ as i | ("-")?['0'-'9']+ as i { ENTIER (int_of_string i) }
{ ENTIER (int_of_string i) }
(* identifiants et mots-clefs *) (* identifiants et mots-clefs *)
| ['a'-'z'](['A'-'Z''a'-'z''0'-'9']|"-"|"_")* as n | ['a'-'z'](['A'-'Z''a'-'z''0'-'9']|"-"|"_")* as n { ident n }
{ ident n }
(* fin de lecture *) (* fin de lecture *)
| eof { EOF } | eof { EOF }
(* entrée non reconnue *) (* entrée non reconnue *)
| _ { error lexbuf } | _ { error lexbuf }

View file

@ -1,90 +0,0 @@
; fichiersRat/src-rat-tam-test/testfun5.rat
JUMP main
pgcd
LOADL 0
LOAD (1) -2[LB]
LOAD (1) -1[LB]
boucle
LOAD (1) 5[LB]
JUMPIF (0) fin
LOAD (1) 4[LB]
LOAD (1) 5 [LB]
SUBR IMod
STORE (1) 3[LB]
LOAD (1) 5[LB]
STORE (1) 4[LB]
LOAD (1) 3[LB]
STORE(1) 5[LB]
JUMP boucle
fin
LOAD (1) 4[LB]
RETURN (1) 2
norm
LOAD (1) -2[LB]
LOAD (1) -1[LB]
CALL (LB) pgcd
LOAD (1) -2[LB]
LOAD (1) 3[LB]
SUBR IDiv
LOAD (1) -1[LB]
LOAD (1) 3[LB]
SUBR IDiv
RETURN (2) 2
ROut
LOADL '['
SUBR COut
LOAD (1) -2[LB]
SUBR IOut
LOADL '/'
SUBR COut
LOAD (1) -1[LB]
SUBR IOut
LOADL ']'
SUBR COut
RETURN (0) 2
RAdd
LOAD (1) -4[LB]
LOAD (1) -1[LB]
SUBR IMul
LOAD (1) -2[LB]
LOAD (1) -3[LB]
SUBR IMul
SUBR IAdd
LOAD (1) -3[LB]
LOAD (1) -1[LB]
SUBR IMul
CALL (ST) norm
RETURN (2) 4
RMul
LOAD (1) -4[LB]
LOAD (1) -2[LB]
SUBR IMul
LOAD (1) -3[LB]
LOAD (1) -1[LB]
SUBR IMul
CALL (ST) norm
RETURN (2) 4
f1
PUSH 1
LOAD (1) -1[LB]
STORE (1) 3[LB]
POP (1) 1
LOADL ''
RETURN (0) 1
main
PUSH 1
LOADL 13
CALL (ST) f1
STORE (1) 0[SB]
LOAD (1) 0[SB]
SUBR IOut
POP (0) 1
HALT

View file

@ -1,12 +1,10 @@
/* Imports. */ /* Imports. */
%{ %{
open Type open Type
open Ast.AstSyntax open Ast.AstSyntax
%} %}
%token <int> ENTIER %token <int> ENTIER
%token <string> ID %token <string> ID
%token RETURN %token RETURN
@ -37,6 +35,10 @@ open Ast.AstSyntax
%token INF %token INF
%token EOF %token EOF
%token NULL
%token NEW
%token AMP
(* Type de l'attribut synthétisé des non-terminaux *) (* Type de l'attribut synthétisé des non-terminaux *)
%type <programme> prog %type <programme> prog
%type <instruction list> bloc %type <instruction list> bloc
@ -75,6 +77,7 @@ i :
| IF exp=e li1=bloc ELSE li2=bloc {Conditionnelle (exp,li1,li2)} | IF exp=e li1=bloc ELSE li2=bloc {Conditionnelle (exp,li1,li2)}
| WHILE exp=e li=bloc {TantQue (exp,li)} | WHILE exp=e li=bloc {TantQue (exp,li)}
| RETURN exp=e PV {Retour (exp)} | RETURN exp=e PV {Retour (exp)}
| a1=a EQUAL exp=e1 {Affectation(Deref(a1), e1)}
dp : dp :
| {[]} | {[]}
@ -84,11 +87,11 @@ typ :
| BOOL {Bool} | BOOL {Bool}
| INT {Int} | INT {Int}
| RAT {Rat} | RAT {Rat}
| t1=typ MULT {Deref t1}
e : e :
| CALL n=ID PO lp=cp PF {AppelFonction (n,lp)} | CALL n=ID PO lp=cp PF {AppelFonction (n,lp)}
| CO e1=e SLASH e2=e CF {Binaire(Fraction,e1,e2)} | CO e1=e SLASH e2=e CF {Binaire(Fraction,e1,e2)}
| n=ID {Ident n}
| TRUE {Booleen true} | TRUE {Booleen true}
| FALSE {Booleen false} | FALSE {Booleen false}
| e=ENTIER {Entier e} | e=ENTIER {Entier e}
@ -99,8 +102,15 @@ e :
| PO e1=e EQUAL e2=e PF {Binaire (Equ,e1,e2)} | PO e1=e EQUAL e2=e PF {Binaire (Equ,e1,e2)}
| PO e1=e INF e2=e PF {Binaire (Inf,e1,e2)} | PO e1=e INF e2=e PF {Binaire (Inf,e1,e2)}
| PO exp=e PF {exp} | PO exp=e PF {exp}
| a1=a {Affectable a1}
| NULL { ??? }
| PO NEW t1=typ PF { ??? }
| AMP n=ID { Deref n }
cp : cp :
| {[]} | {[]}
| e1=e le=cp {e1::le} | e1=e le=cp {e1::le}
a :
| n=ID {Ident n}
| PO MULT a1=a PF {Deref a1}