diff --git a/.gitignore b/.gitignore index 5135c3d..09e6d01 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,4 @@ Tables/Fonctions/test Lex_Yacc/as.output Lex_Yacc/as.tab.* Lex_Yacc/lex.yy.* +Lex_Yacc/as.dot diff --git a/Documentation/Projet_Syst_Info_2021.pdf b/Documentation/Projet_Syst_Info_2021.pdf deleted file mode 100644 index ca8854c..0000000 Binary files a/Documentation/Projet_Syst_Info_2021.pdf and /dev/null differ diff --git a/Documentation/grammaire_c_minimaliste b/Documentation/grammaire_c_minimaliste deleted file mode 100644 index 32f0faa..0000000 --- a/Documentation/grammaire_c_minimaliste +++ /dev/null @@ -1,52 +0,0 @@ -les fonctions (avec parametres) -le if -le while -les declarations -les affectations -les operations arith. -le retour de fonction -l'invocation de fonctions - - -C : Fonctions ; -Fonctions : Fonction Fonctions | Fonction ; - -Fonction : tInt tID tPO Params tPF Body ; - -Params : | Param SuiteParams ; -Param : tInt tID ; - -SuiteParams : tVirgule Param SuiteParams | ; - -// Ps : P Ps | ; -// P : tInt tID tVirgule -// Ps =>* tInt tID tVirgule tInt tID tVirgule -// Ps => P Ps => P P Ps ... - -Body : tAO Instructions tAF ; - -Instructions : Instruction Instructions | ; - -Instruction : Aff | If | While | Return | Decl | Invocation tPV ; - -Aff : tID tEQ E tPV ; - -E : tNB | tID | E tADD E | E tMUL E | E tMINUS E | E tDIV E | Invocation | tPO E tPF | tMINUS E ; - -// E : tID tADD tID | ... - -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 ; - - - - - - diff --git a/Documentation/transcription_opcodes.md b/Documentation/transcription_opcodes.md index 636ec2f..f639354 100644 --- a/Documentation/transcription_opcodes.md +++ b/Documentation/transcription_opcodes.md @@ -30,17 +30,17 @@ Copie la valeur val à l'adresse @X Copie la valeur contenue dans @C à l'adresse @X en considérant que ce qui est copié est une adresse (et donc il faut ajouter BP) -## AFCA @X addr +## AFCA @X val -Copie la valeur addr à l'adresse @X en considérant que ce qui est copié est une adresse (et donc il faut ajouter BP) +Copie la val à l'adresse @X en considérant que ce qui est copié est une adresse (et donc il faut ajouter BP) -## JMP lig +## JMP ins -Saute vers la ligne lig dans le code sans condition +Saute vers la ligne ins dans le code sans condition -## JMF @X lig +## JMF @X ins -Saute vers la ligne lig dans le code si la valeur à l'adresse @X est 0 +Saute vers la ligne ins dans le code si la valeur à l'adresse @X est 0 ## INF @X @A @B @@ -62,14 +62,15 @@ Va mettre à l'adresse @X ce qui est à l'addresse contenue à l'adresse @Y (on Va mettre le contenu de @Y dans l'adresse qui est la valeur dans @X (on considère que @X est un pointeur et on écrit dans l'adresse qui est contenue dans @X). Attention, considérer des addresses globales (pas relatives). -##CALL lig taille_pile_fonction_appelante +##CALL ins taille_pile_fonction_appelante + +Appelle la fonction dont la première ligne est ins et taille_pile_fonction_appelante est la taille de la zone mémoire utilisée par la fonction appelante (avant le push des arguments !) -Appelle la fonction dont la première ligne est lig et taille_pile_fonction_appelante est la taille de la zone mémoire utilisée par la fonction appelante (avant le push des args !) ##RET -Bouge BP et saute à l'adresse de retour (selon les valeur qui sont dans la pile de contrôle). +Restore BP et saute à l'adresse de retour (selon les valeur qui sont dans la pile de contrôle). -##STOP +##STOP val -Arrete le processeur (à mettre à la fin de l'ASM) +Arrete le processeur si val vaut 0 (à mettre à la fin de l'ASM), ou, arrete le processeur pour val tick d'horloge (si val > 0) diff --git a/Lex_Yacc/al.lex b/Lex_Yacc/al.lex index b6ba06f..9b810ae 100644 --- a/Lex_Yacc/al.lex +++ b/Lex_Yacc/al.lex @@ -1,4 +1,4 @@ -%{ +%{ // Ne pas toucher #include "as.tab.h" int yywrap(void){return 1;} void @@ -11,44 +11,57 @@ yyerror (char const *s) %% -"main" { return tMAIN ;} -"{" { return tOBRACKET;} -"}" { return tCBRACKET; } -"(" { return tOBRACE; } -")" { return tCBRACE; } -"const" { return tCONST; } -"int" { return tINT; } -"printf" { return tPRINTF; } //Degeu mais à degager -"if" { return tIF; } -"while" { return tWHILE; } -"return" {return tRETURN; } -"<" { return tLT; } -">" { return tGT; } -"==" { return tEQCOND; } -"&&" { return tAND; } -"||" { return tOR; } -"else" { return tELSE;} -"&" { return tADDR;} -"[" { return tOCROCH;} -"]" { return tCCROCH;} -"get" { return tGET;} -"stop" { return tSTOP;} + +"main" { return tMAIN; } // Token de la fonction main + +"{" { return tOBRACKET; } // Token accolade ouvrante +"}" { return tCBRACKET; } // Token accolade fermante +"(" { return tOBRACE; } // Token parenthèse ouvrante +")" { return tCBRACE; } // Token parenthèse fermante + +"const" { return tCONST; } // Token constante +"int" { return tINT; } // Token type int + +"if" { return tIF; } // Token if +"else" { return tELSE; } // Token else +"while" { return tWHILE; } // Token while + +"return" {return tRETURN; } // Token return + +"<" { return tLT; } // Token plus petit que +">" { return tGT; } // Token plus grand que +"==" { return tEQCOND; } // Token égal comparaison + +"&&" { return tAND; } // Token ET +"||" { return tOR; } // Token OU + +"&" { return tADDR; } // Token adresse +"[" { return tOCROCH; } // Token crochet ouvrante +"]" { return tCCROCH; } // Token crochet ouvrante + +"get" { return tGET; } // Token fonction get +"printf" { return tPRINTF; } // Token fonction print +"stop" { return tSTOP; } // Token fonction stop + +"+" { return tADD; } // Token addition +"-" { return tSUB; } // Token soustraction +"*" { return tMUL; } // Token multiplication +"/" { return tDIV; } // Token division + +"=" { return tEQ; } // Token egal affectation + +";" { return tPV; } +"," { return tCOMA; } + +[0-9]+ { yylval.nombre = atoi(yytext); return tNB; } // Token nombre au format classique +[0-9]+e[0-9]+ { yylval.nombre = -1; return tNB; } // Token nombre au format exponentiel + +[a-zA-Z][a-zA-Z0-9_]* { strcpy(yylval.id, yytext); return tID; } // Chaine de caractère (identifiant variable, fonction..) -[0-9]+ { yylval.nombre = atoi(yytext); return tNB; } -[0-9]+e[0-9]+ { yylval.nombre = -1; return tNBEXP; } //Renvoyer le token tNB et pas tNBEXP -"+" { return tADD; } -"-" { return tSUB; } -"*" { return tMUL; } -"/" { return tDIV; } -"=" { return tEQ; } -";" { return tPV; } -" " {} //Ne pas les retourner à Yacc -" " {} //Ne pas les retourner à Yacc -"," { return tCOMA; } -"\n" {} //Ne pas les retourner à Yacc -[a-zA-Z][a-zA-Z0-9_]* { strcpy(yylval.id, yytext); return tID; } -. { }//return tERROR; } +" " {} //Ne pas les retourner à Yacc (espace) +" " {} //Ne pas les retourner à Yacc (tabulation) +"\n" {} //Ne pas les retourner à Yacc (retour chariot) %% diff --git a/Lex_Yacc/as.dot b/Lex_Yacc/as.dot deleted file mode 100644 index 3b64643..0000000 --- a/Lex_Yacc/as.dot +++ /dev/null @@ -1,1048 +0,0 @@ -// Produit par GNU Bison 3.0.4. -// Rapporter les bugs à . -// Page d'accueil: . - -digraph "Lex_Yacc/as.y" -{ - node [fontname = courier, shape = box, colorscheme = paired6] - edge [fontname = courier] - - 0 [label="État 0\n\l 0 $accept: . C $end\l"] - 0 -> 1 [style=solid label="tINT"] - 0 -> 2 [style=dashed label="C"] - 0 -> 3 [style=dashed label="Main"] - 0 -> 4 [style=dashed label="Fonction"] - 0 -> 5 [style=dashed label="Type"] - 1 [label="État 1\n\l 5 Main: tINT . $@1 tMAIN tOBRACE Args tCBRACE Body\l 76 Type: tINT .\l"] - 1 -> 6 [style=dashed label="$@1"] - 1 -> "1R4" [label="[tMAIN]", style=solid] - "1R4" [label="R4", fillcolor=3, shape=diamond, style=filled] - 1 -> "1R76" [style=solid] - "1R76" [label="R76", fillcolor=3, shape=diamond, style=filled] - 2 [label="État 2\n\l 0 $accept: C . $end\l"] - 2 -> 7 [style=solid label="$end"] - 3 [label="État 3\n\l 10 Fonction: Main .\l"] - 3 -> "3R10" [style=solid] - "3R10" [label="R10", fillcolor=3, shape=diamond, style=filled] - 4 [label="État 4\n\l 1 C: Fonction . Fonctions\l"] - 4 -> 1 [style=solid label="tINT"] - 4 -> 8 [style=dashed label="Fonctions"] - 4 -> 3 [style=dashed label="Main"] - 4 -> 9 [style=dashed label="Fonction"] - 4 -> 5 [style=dashed label="Type"] - 4 -> "4R3" [style=solid] - "4R3" [label="R3", fillcolor=3, shape=diamond, style=filled] - 5 [label="État 5\n\l 9 Fonction: Type . tID $@2 tOBRACE $@3 Args $@4 tCBRACE Body\l 77 Type: Type . tMUL\l"] - 5 -> 10 [style=solid label="tMUL"] - 5 -> 11 [style=solid label="tID"] - 6 [label="État 6\n\l 5 Main: tINT $@1 . tMAIN tOBRACE Args tCBRACE Body\l"] - 6 -> 12 [style=solid label="tMAIN"] - 7 [label="État 7\n\l 0 $accept: C $end .\l"] - 7 -> "7R0" [style=solid] - "7R0" [label="Acc", fillcolor=1, shape=diamond, style=filled] - 8 [label="État 8\n\l 1 C: Fonction Fonctions .\l"] - 8 -> "8R1" [style=solid] - "8R1" [label="R1", fillcolor=3, shape=diamond, style=filled] - 9 [label="État 9\n\l 2 Fonctions: Fonction . Fonctions\l"] - 9 -> 1 [style=solid label="tINT"] - 9 -> 13 [style=dashed label="Fonctions"] - 9 -> 3 [style=dashed label="Main"] - 9 -> 9 [style=dashed label="Fonction"] - 9 -> 5 [style=dashed label="Type"] - 9 -> "9R3" [style=solid] - "9R3" [label="R3", fillcolor=3, shape=diamond, style=filled] - 10 [label="État 10\n\l 77 Type: Type tMUL .\l"] - 10 -> "10R77" [style=solid] - "10R77" [label="R77", fillcolor=3, shape=diamond, style=filled] - 11 [label="État 11\n\l 9 Fonction: Type tID . $@2 tOBRACE $@3 Args $@4 tCBRACE Body\l"] - 11 -> 14 [style=dashed label="$@2"] - 11 -> "11R6" [style=solid] - "11R6" [label="R6", fillcolor=3, shape=diamond, style=filled] - 12 [label="État 12\n\l 5 Main: tINT $@1 tMAIN . tOBRACE Args tCBRACE Body\l"] - 12 -> 15 [style=solid label="tOBRACE"] - 13 [label="État 13\n\l 2 Fonctions: Fonction Fonctions .\l"] - 13 -> "13R2" [style=solid] - "13R2" [label="R2", fillcolor=3, shape=diamond, style=filled] - 14 [label="État 14\n\l 9 Fonction: Type tID $@2 . tOBRACE $@3 Args $@4 tCBRACE Body\l"] - 14 -> 16 [style=solid label="tOBRACE"] - 15 [label="État 15\n\l 5 Main: tINT $@1 tMAIN tOBRACE . Args tCBRACE Body\l"] - 15 -> 17 [style=solid label="tINT"] - 15 -> 18 [style=dashed label="Args"] - 15 -> 19 [style=dashed label="Arg"] - 15 -> 20 [style=dashed label="Type"] - 15 -> "15R15" [style=solid] - "15R15" [label="R15", fillcolor=3, shape=diamond, style=filled] - 16 [label="État 16\n\l 9 Fonction: Type tID $@2 tOBRACE . $@3 Args $@4 tCBRACE Body\l"] - 16 -> 21 [style=dashed label="$@3"] - 16 -> "16R7" [style=solid] - "16R7" [label="R7", fillcolor=3, shape=diamond, style=filled] - 17 [label="État 17\n\l 76 Type: tINT .\l"] - 17 -> "17R76" [style=solid] - "17R76" [label="R76", fillcolor=3, shape=diamond, style=filled] - 18 [label="État 18\n\l 5 Main: tINT $@1 tMAIN tOBRACE Args . tCBRACE Body\l"] - 18 -> 22 [style=solid label="tCBRACE"] - 19 [label="État 19\n\l 14 Args: Arg . ArgSuite\l"] - 19 -> 23 [style=solid label="tCOMA"] - 19 -> 24 [style=dashed label="ArgSuite"] - 19 -> "19R19" [style=solid] - "19R19" [label="R19", fillcolor=3, shape=diamond, style=filled] - 20 [label="État 20\n\l 16 Arg: Type . tID\l 17 | Type . tID tOCROCH tCCROCH\l 77 Type: Type . tMUL\l"] - 20 -> 10 [style=solid label="tMUL"] - 20 -> 25 [style=solid label="tID"] - 21 [label="État 21\n\l 9 Fonction: Type tID $@2 tOBRACE $@3 . Args $@4 tCBRACE Body\l"] - 21 -> 17 [style=solid label="tINT"] - 21 -> 26 [style=dashed label="Args"] - 21 -> 19 [style=dashed label="Arg"] - 21 -> 20 [style=dashed label="Type"] - 21 -> "21R15" [style=solid] - "21R15" [label="R15", fillcolor=3, shape=diamond, style=filled] - 22 [label="État 22\n\l 5 Main: tINT $@1 tMAIN tOBRACE Args tCBRACE . Body\l"] - 22 -> 27 [style=solid label="tOBRACKET"] - 22 -> 28 [style=dashed label="Body"] - 23 [label="État 23\n\l 18 ArgSuite: tCOMA . Arg ArgSuite\l"] - 23 -> 17 [style=solid label="tINT"] - 23 -> 29 [style=dashed label="Arg"] - 23 -> 20 [style=dashed label="Type"] - 24 [label="État 24\n\l 14 Args: Arg ArgSuite .\l"] - 24 -> "24R14" [style=solid] - "24R14" [label="R14", fillcolor=3, shape=diamond, style=filled] - 25 [label="État 25\n\l 16 Arg: Type tID .\l 17 | Type tID . tOCROCH tCCROCH\l"] - 25 -> 30 [style=solid label="tOCROCH"] - 25 -> "25R16" [style=solid] - "25R16" [label="R16", fillcolor=3, shape=diamond, style=filled] - 26 [label="État 26\n\l 9 Fonction: Type tID $@2 tOBRACE $@3 Args . $@4 tCBRACE Body\l"] - 26 -> 31 [style=dashed label="$@4"] - 26 -> "26R8" [style=solid] - "26R8" [label="R8", fillcolor=3, shape=diamond, style=filled] - 27 [label="État 27\n\l 21 Body: tOBRACKET . $@5 Instructions tCBRACKET\l"] - 27 -> 32 [style=dashed label="$@5"] - 27 -> "27R20" [style=solid] - "27R20" [label="R20", fillcolor=3, shape=diamond, style=filled] - 28 [label="État 28\n\l 5 Main: tINT $@1 tMAIN tOBRACE Args tCBRACE Body .\l"] - 28 -> "28R5" [style=solid] - "28R5" [label="R5", fillcolor=3, shape=diamond, style=filled] - 29 [label="État 29\n\l 18 ArgSuite: tCOMA Arg . ArgSuite\l"] - 29 -> 23 [style=solid label="tCOMA"] - 29 -> 33 [style=dashed label="ArgSuite"] - 29 -> "29R19" [style=solid] - "29R19" [label="R19", fillcolor=3, shape=diamond, style=filled] - 30 [label="État 30\n\l 17 Arg: Type tID tOCROCH . tCCROCH\l"] - 30 -> 34 [style=solid label="tCCROCH"] - 31 [label="État 31\n\l 9 Fonction: Type tID $@2 tOBRACE $@3 Args $@4 . tCBRACE Body\l"] - 31 -> 35 [style=solid label="tCBRACE"] - 32 [label="État 32\n\l 21 Body: tOBRACKET $@5 . Instructions tCBRACKET\l"] - 32 -> 17 [style=solid label="tINT"] - 32 -> 36 [style=solid label="tCONST"] - 32 -> 37 [style=solid label="tMUL"] - 32 -> 38 [style=solid label="tID"] - 32 -> 39 [style=solid label="tPRINTF"] - 32 -> 40 [style=solid label="tSTOP"] - 32 -> 41 [style=solid label="tIF"] - 32 -> 42 [style=solid label="tWHILE"] - 32 -> 43 [style=solid label="tRETURN"] - 32 -> 44 [style=dashed label="Stop"] - 32 -> 45 [style=dashed label="Return"] - 32 -> 46 [style=dashed label="Instructions"] - 32 -> 47 [style=dashed label="Instruction"] - 32 -> 48 [style=dashed label="Invocation"] - 32 -> 49 [style=dashed label="If"] - 32 -> 50 [style=dashed label="While"] - 32 -> 51 [style=dashed label="Aff"] - 32 -> 52 [style=dashed label="DebutAff"] - 32 -> 53 [style=dashed label="DebutAffPointeur"] - 32 -> 54 [style=dashed label="SuiteAffPointeur"] - 32 -> 55 [style=dashed label="Type"] - 32 -> 56 [style=dashed label="Decl"] - 32 -> "32R23" [style=solid] - "32R23" [label="R23", fillcolor=3, shape=diamond, style=filled] - 33 [label="État 33\n\l 18 ArgSuite: tCOMA Arg ArgSuite .\l"] - 33 -> "33R18" [style=solid] - "33R18" [label="R18", fillcolor=3, shape=diamond, style=filled] - 34 [label="État 34\n\l 17 Arg: Type tID tOCROCH tCCROCH .\l"] - 34 -> "34R17" [style=solid] - "34R17" [label="R17", fillcolor=3, shape=diamond, style=filled] - 35 [label="État 35\n\l 9 Fonction: Type tID $@2 tOBRACE $@3 Args $@4 tCBRACE . Body\l"] - 35 -> 27 [style=solid label="tOBRACKET"] - 35 -> 57 [style=dashed label="Body"] - 36 [label="État 36\n\l 79 Decl: tCONST . Type SuiteDeclConst FinDeclConst\l"] - 36 -> 17 [style=solid label="tINT"] - 36 -> 58 [style=dashed label="Type"] - 37 [label="État 37\n\l 50 DebutAffPointeur: tMUL . SuiteAffPointeur\l 52 SuiteAffPointeur: tMUL . tID\l"] - 37 -> 59 [style=solid label="tMUL"] - 37 -> 60 [style=solid label="tID"] - 37 -> 61 [style=dashed label="SuiteAffPointeur"] - 38 [label="État 38\n\l 32 Invocation: tID . tOBRACE $@6 Params tCBRACE\l 49 DebutAff: tID .\l 53 SuiteAffPointeur: tID . tOCROCH E tCCROCH\l"] - 38 -> 62 [style=solid label="tOBRACE"] - 38 -> 63 [style=solid label="tOCROCH"] - 38 -> "38R49" [style=solid] - "38R49" [label="R49", fillcolor=3, shape=diamond, style=filled] - 39 [label="État 39\n\l 33 Invocation: tPRINTF . tOBRACE E tCBRACE\l"] - 39 -> 64 [style=solid label="tOBRACE"] - 40 [label="État 40\n\l 12 Stop: tSTOP . tOBRACE tNB tCBRACE\l"] - 40 -> 65 [style=solid label="tOBRACE"] - 41 [label="État 41\n\l 41 If: tIF . tOBRACE E tCBRACE $@7 Body $@8 Else\l"] - 41 -> 66 [style=solid label="tOBRACE"] - 42 [label="État 42\n\l 46 While: tWHILE . tOBRACE E tCBRACE $@9 Body\l"] - 42 -> 67 [style=solid label="tOBRACE"] - 43 [label="État 43\n\l 13 Return: tRETURN . E tPV\l"] - 43 -> 68 [style=solid label="tOBRACE"] - 43 -> 69 [style=solid label="tMUL"] - 43 -> 70 [style=solid label="tSUB"] - 43 -> 71 [style=solid label="tNB"] - 43 -> 72 [style=solid label="tNBEXP"] - 43 -> 73 [style=solid label="tID"] - 43 -> 39 [style=solid label="tPRINTF"] - 43 -> 74 [style=solid label="tGET"] - 43 -> 75 [style=solid label="tADDR"] - 43 -> 76 [style=solid label="tNOT"] - 43 -> 77 [style=dashed label="Get"] - 43 -> 78 [style=dashed label="Invocation"] - 43 -> 79 [style=dashed label="E"] - 44 [label="État 44\n\l 30 Instruction: Stop . tPV\l"] - 44 -> 80 [style=solid label="tPV"] - 45 [label="État 45\n\l 29 Instruction: Return .\l"] - 45 -> "45R29" [style=solid] - "45R29" [label="R29", fillcolor=3, shape=diamond, style=filled] - 46 [label="État 46\n\l 21 Body: tOBRACKET $@5 Instructions . tCBRACKET\l"] - 46 -> 81 [style=solid label="tCBRACKET"] - 47 [label="État 47\n\l 22 Instructions: Instruction . Instructions\l"] - 47 -> 17 [style=solid label="tINT"] - 47 -> 36 [style=solid label="tCONST"] - 47 -> 37 [style=solid label="tMUL"] - 47 -> 38 [style=solid label="tID"] - 47 -> 39 [style=solid label="tPRINTF"] - 47 -> 40 [style=solid label="tSTOP"] - 47 -> 41 [style=solid label="tIF"] - 47 -> 42 [style=solid label="tWHILE"] - 47 -> 43 [style=solid label="tRETURN"] - 47 -> 44 [style=dashed label="Stop"] - 47 -> 45 [style=dashed label="Return"] - 47 -> 82 [style=dashed label="Instructions"] - 47 -> 47 [style=dashed label="Instruction"] - 47 -> 48 [style=dashed label="Invocation"] - 47 -> 49 [style=dashed label="If"] - 47 -> 50 [style=dashed label="While"] - 47 -> 51 [style=dashed label="Aff"] - 47 -> 52 [style=dashed label="DebutAff"] - 47 -> 53 [style=dashed label="DebutAffPointeur"] - 47 -> 54 [style=dashed label="SuiteAffPointeur"] - 47 -> 55 [style=dashed label="Type"] - 47 -> 56 [style=dashed label="Decl"] - 47 -> "47R23" [style=solid] - "47R23" [label="R23", fillcolor=3, shape=diamond, style=filled] - 48 [label="État 48\n\l 26 Instruction: Invocation . tPV\l"] - 48 -> 83 [style=solid label="tPV"] - 49 [label="État 49\n\l 27 Instruction: If .\l"] - 49 -> "49R27" [style=solid] - "49R27" [label="R27", fillcolor=3, shape=diamond, style=filled] - 50 [label="État 50\n\l 28 Instruction: While .\l"] - 50 -> "50R28" [style=solid] - "50R28" [label="R28", fillcolor=3, shape=diamond, style=filled] - 51 [label="État 51\n\l 24 Instruction: Aff .\l"] - 51 -> "51R24" [style=solid] - "51R24" [label="R24", fillcolor=3, shape=diamond, style=filled] - 52 [label="État 52\n\l 47 Aff: DebutAff . tEQ E tPV\l"] - 52 -> 84 [style=solid label="tEQ"] - 53 [label="État 53\n\l 48 Aff: DebutAffPointeur . tEQ E tPV\l"] - 53 -> 85 [style=solid label="tEQ"] - 54 [label="État 54\n\l 51 DebutAffPointeur: SuiteAffPointeur .\l"] - 54 -> "54R51" [style=solid] - "54R51" [label="R51", fillcolor=3, shape=diamond, style=filled] - 55 [label="État 55\n\l 77 Type: Type . tMUL\l 78 Decl: Type . SuiteDecl FinDecl\l"] - 55 -> 10 [style=solid label="tMUL"] - 55 -> 86 [style=solid label="tID"] - 55 -> 87 [style=dashed label="SuiteDecl"] - 56 [label="État 56\n\l 25 Instruction: Decl .\l"] - 56 -> "56R25" [style=solid] - "56R25" [label="R25", fillcolor=3, shape=diamond, style=filled] - 57 [label="État 57\n\l 9 Fonction: Type tID $@2 tOBRACE $@3 Args $@4 tCBRACE Body .\l"] - 57 -> "57R9" [style=solid] - "57R9" [label="R9", fillcolor=3, shape=diamond, style=filled] - 58 [label="État 58\n\l 77 Type: Type . tMUL\l 79 Decl: tCONST Type . SuiteDeclConst FinDeclConst\l"] - 58 -> 10 [style=solid label="tMUL"] - 58 -> 88 [style=solid label="tID"] - 58 -> 89 [style=dashed label="SuiteDeclConst"] - 59 [label="État 59\n\l 52 SuiteAffPointeur: tMUL . tID\l"] - 59 -> 90 [style=solid label="tID"] - 60 [label="État 60\n\l 52 SuiteAffPointeur: tMUL tID .\l 53 | tID . tOCROCH E tCCROCH\l"] - 60 -> 63 [style=solid label="tOCROCH"] - 60 -> "60R52" [style=solid] - "60R52" [label="R52", fillcolor=3, shape=diamond, style=filled] - 61 [label="État 61\n\l 50 DebutAffPointeur: tMUL SuiteAffPointeur .\l"] - 61 -> "61R50" [style=solid] - "61R50" [label="R50", fillcolor=3, shape=diamond, style=filled] - 62 [label="État 62\n\l 32 Invocation: tID tOBRACE . $@6 Params tCBRACE\l"] - 62 -> 91 [style=dashed label="$@6"] - 62 -> "62R31" [style=solid] - "62R31" [label="R31", fillcolor=3, shape=diamond, style=filled] - 63 [label="État 63\n\l 53 SuiteAffPointeur: tID tOCROCH . E tCCROCH\l"] - 63 -> 68 [style=solid label="tOBRACE"] - 63 -> 69 [style=solid label="tMUL"] - 63 -> 70 [style=solid label="tSUB"] - 63 -> 71 [style=solid label="tNB"] - 63 -> 72 [style=solid label="tNBEXP"] - 63 -> 73 [style=solid label="tID"] - 63 -> 39 [style=solid label="tPRINTF"] - 63 -> 74 [style=solid label="tGET"] - 63 -> 75 [style=solid label="tADDR"] - 63 -> 76 [style=solid label="tNOT"] - 63 -> 77 [style=dashed label="Get"] - 63 -> 78 [style=dashed label="Invocation"] - 63 -> 92 [style=dashed label="E"] - 64 [label="État 64\n\l 33 Invocation: tPRINTF tOBRACE . E tCBRACE\l"] - 64 -> 68 [style=solid label="tOBRACE"] - 64 -> 69 [style=solid label="tMUL"] - 64 -> 70 [style=solid label="tSUB"] - 64 -> 71 [style=solid label="tNB"] - 64 -> 72 [style=solid label="tNBEXP"] - 64 -> 73 [style=solid label="tID"] - 64 -> 39 [style=solid label="tPRINTF"] - 64 -> 74 [style=solid label="tGET"] - 64 -> 75 [style=solid label="tADDR"] - 64 -> 76 [style=solid label="tNOT"] - 64 -> 77 [style=dashed label="Get"] - 64 -> 78 [style=dashed label="Invocation"] - 64 -> 93 [style=dashed label="E"] - 65 [label="État 65\n\l 12 Stop: tSTOP tOBRACE . tNB tCBRACE\l"] - 65 -> 94 [style=solid label="tNB"] - 66 [label="État 66\n\l 41 If: tIF tOBRACE . E tCBRACE $@7 Body $@8 Else\l"] - 66 -> 68 [style=solid label="tOBRACE"] - 66 -> 69 [style=solid label="tMUL"] - 66 -> 70 [style=solid label="tSUB"] - 66 -> 71 [style=solid label="tNB"] - 66 -> 72 [style=solid label="tNBEXP"] - 66 -> 73 [style=solid label="tID"] - 66 -> 39 [style=solid label="tPRINTF"] - 66 -> 74 [style=solid label="tGET"] - 66 -> 75 [style=solid label="tADDR"] - 66 -> 76 [style=solid label="tNOT"] - 66 -> 77 [style=dashed label="Get"] - 66 -> 78 [style=dashed label="Invocation"] - 66 -> 95 [style=dashed label="E"] - 67 [label="État 67\n\l 46 While: tWHILE tOBRACE . E tCBRACE $@9 Body\l"] - 67 -> 68 [style=solid label="tOBRACE"] - 67 -> 69 [style=solid label="tMUL"] - 67 -> 70 [style=solid label="tSUB"] - 67 -> 71 [style=solid label="tNB"] - 67 -> 72 [style=solid label="tNBEXP"] - 67 -> 73 [style=solid label="tID"] - 67 -> 39 [style=solid label="tPRINTF"] - 67 -> 74 [style=solid label="tGET"] - 67 -> 75 [style=solid label="tADDR"] - 67 -> 76 [style=solid label="tNOT"] - 67 -> 77 [style=dashed label="Get"] - 67 -> 78 [style=dashed label="Invocation"] - 67 -> 96 [style=dashed label="E"] - 68 [label="État 68\n\l 61 E: tOBRACE . E tCBRACE\l"] - 68 -> 68 [style=solid label="tOBRACE"] - 68 -> 69 [style=solid label="tMUL"] - 68 -> 70 [style=solid label="tSUB"] - 68 -> 71 [style=solid label="tNB"] - 68 -> 72 [style=solid label="tNBEXP"] - 68 -> 73 [style=solid label="tID"] - 68 -> 39 [style=solid label="tPRINTF"] - 68 -> 74 [style=solid label="tGET"] - 68 -> 75 [style=solid label="tADDR"] - 68 -> 76 [style=solid label="tNOT"] - 68 -> 77 [style=dashed label="Get"] - 68 -> 78 [style=dashed label="Invocation"] - 68 -> 97 [style=dashed label="E"] - 69 [label="État 69\n\l 69 E: tMUL . E\l"] - 69 -> 68 [style=solid label="tOBRACE"] - 69 -> 69 [style=solid label="tMUL"] - 69 -> 70 [style=solid label="tSUB"] - 69 -> 71 [style=solid label="tNB"] - 69 -> 72 [style=solid label="tNBEXP"] - 69 -> 73 [style=solid label="tID"] - 69 -> 39 [style=solid label="tPRINTF"] - 69 -> 74 [style=solid label="tGET"] - 69 -> 75 [style=solid label="tADDR"] - 69 -> 76 [style=solid label="tNOT"] - 69 -> 77 [style=dashed label="Get"] - 69 -> 78 [style=dashed label="Invocation"] - 69 -> 98 [style=dashed label="E"] - 70 [label="État 70\n\l 62 E: tSUB . E\l"] - 70 -> 68 [style=solid label="tOBRACE"] - 70 -> 69 [style=solid label="tMUL"] - 70 -> 70 [style=solid label="tSUB"] - 70 -> 71 [style=solid label="tNB"] - 70 -> 72 [style=solid label="tNBEXP"] - 70 -> 73 [style=solid label="tID"] - 70 -> 39 [style=solid label="tPRINTF"] - 70 -> 74 [style=solid label="tGET"] - 70 -> 75 [style=solid label="tADDR"] - 70 -> 76 [style=solid label="tNOT"] - 70 -> 77 [style=dashed label="Get"] - 70 -> 78 [style=dashed label="Invocation"] - 70 -> 99 [style=dashed label="E"] - 71 [label="État 71\n\l 54 E: tNB .\l"] - 71 -> "71R54" [style=solid] - "71R54" [label="R54", fillcolor=3, shape=diamond, style=filled] - 72 [label="État 72\n\l 55 E: tNBEXP .\l"] - 72 -> "72R55" [style=solid] - "72R55" [label="R55", fillcolor=3, shape=diamond, style=filled] - 73 [label="État 73\n\l 32 Invocation: tID . tOBRACE $@6 Params tCBRACE\l 70 E: tID .\l 71 | tID . tOCROCH E tCCROCH\l"] - 73 -> 62 [style=solid label="tOBRACE"] - 73 -> 100 [style=solid label="tOCROCH"] - 73 -> "73R70" [style=solid] - "73R70" [label="R70", fillcolor=3, shape=diamond, style=filled] - 74 [label="État 74\n\l 11 Get: tGET . tOBRACE tCBRACE\l"] - 74 -> 101 [style=solid label="tOBRACE"] - 75 [label="État 75\n\l 72 E: tADDR . EBis\l"] - 75 -> 102 [style=solid label="tID"] - 75 -> 103 [style=dashed label="EBis"] - 76 [label="État 76\n\l 66 E: tNOT . E\l"] - 76 -> 68 [style=solid label="tOBRACE"] - 76 -> 69 [style=solid label="tMUL"] - 76 -> 70 [style=solid label="tSUB"] - 76 -> 71 [style=solid label="tNB"] - 76 -> 72 [style=solid label="tNBEXP"] - 76 -> 73 [style=solid label="tID"] - 76 -> 39 [style=solid label="tPRINTF"] - 76 -> 74 [style=solid label="tGET"] - 76 -> 75 [style=solid label="tADDR"] - 76 -> 76 [style=solid label="tNOT"] - 76 -> 77 [style=dashed label="Get"] - 76 -> 78 [style=dashed label="Invocation"] - 76 -> 104 [style=dashed label="E"] - 77 [label="État 77\n\l 73 E: Get .\l"] - 77 -> "77R73" [style=solid] - "77R73" [label="R73", fillcolor=3, shape=diamond, style=filled] - 78 [label="État 78\n\l 60 E: Invocation .\l"] - 78 -> "78R60" [style=solid] - "78R60" [label="R60", fillcolor=3, shape=diamond, style=filled] - 79 [label="État 79\n\l 13 Return: tRETURN E . tPV\l 56 E: E . tMUL E\l 57 | E . tDIV E\l 58 | E . tSUB E\l 59 | E . tADD E\l 63 | E . tEQCOND E\l 64 | E . tGT E\l 65 | E . tLT E\l 67 | E . tAND E\l 68 | E . tOR E\l"] - 79 -> 105 [style=solid label="tPV"] - 79 -> 106 [style=solid label="tMUL"] - 79 -> 107 [style=solid label="tDIV"] - 79 -> 108 [style=solid label="tADD"] - 79 -> 109 [style=solid label="tSUB"] - 79 -> 110 [style=solid label="tLT"] - 79 -> 111 [style=solid label="tGT"] - 79 -> 112 [style=solid label="tEQCOND"] - 79 -> 113 [style=solid label="tAND"] - 79 -> 114 [style=solid label="tOR"] - 80 [label="État 80\n\l 30 Instruction: Stop tPV .\l"] - 80 -> "80R30" [style=solid] - "80R30" [label="R30", fillcolor=3, shape=diamond, style=filled] - 81 [label="État 81\n\l 21 Body: tOBRACKET $@5 Instructions tCBRACKET .\l"] - 81 -> "81R21" [style=solid] - "81R21" [label="R21", fillcolor=3, shape=diamond, style=filled] - 82 [label="État 82\n\l 22 Instructions: Instruction Instructions .\l"] - 82 -> "82R22" [style=solid] - "82R22" [label="R22", fillcolor=3, shape=diamond, style=filled] - 83 [label="État 83\n\l 26 Instruction: Invocation tPV .\l"] - 83 -> "83R26" [style=solid] - "83R26" [label="R26", fillcolor=3, shape=diamond, style=filled] - 84 [label="État 84\n\l 47 Aff: DebutAff tEQ . E tPV\l"] - 84 -> 68 [style=solid label="tOBRACE"] - 84 -> 69 [style=solid label="tMUL"] - 84 -> 70 [style=solid label="tSUB"] - 84 -> 71 [style=solid label="tNB"] - 84 -> 72 [style=solid label="tNBEXP"] - 84 -> 73 [style=solid label="tID"] - 84 -> 39 [style=solid label="tPRINTF"] - 84 -> 74 [style=solid label="tGET"] - 84 -> 75 [style=solid label="tADDR"] - 84 -> 76 [style=solid label="tNOT"] - 84 -> 77 [style=dashed label="Get"] - 84 -> 78 [style=dashed label="Invocation"] - 84 -> 115 [style=dashed label="E"] - 85 [label="État 85\n\l 48 Aff: DebutAffPointeur tEQ . E tPV\l"] - 85 -> 68 [style=solid label="tOBRACE"] - 85 -> 69 [style=solid label="tMUL"] - 85 -> 70 [style=solid label="tSUB"] - 85 -> 71 [style=solid label="tNB"] - 85 -> 72 [style=solid label="tNBEXP"] - 85 -> 73 [style=solid label="tID"] - 85 -> 39 [style=solid label="tPRINTF"] - 85 -> 74 [style=solid label="tGET"] - 85 -> 75 [style=solid label="tADDR"] - 85 -> 76 [style=solid label="tNOT"] - 85 -> 77 [style=dashed label="Get"] - 85 -> 78 [style=dashed label="Invocation"] - 85 -> 116 [style=dashed label="E"] - 86 [label="État 86\n\l 80 SuiteDecl: tID .\l 81 | tID . tEQ E\l 82 | tID . tOCROCH tNB tCCROCH\l"] - 86 -> 117 [style=solid label="tOCROCH"] - 86 -> 118 [style=solid label="tEQ"] - 86 -> "86R80" [style=solid] - "86R80" [label="R80", fillcolor=3, shape=diamond, style=filled] - 87 [label="État 87\n\l 78 Decl: Type SuiteDecl . FinDecl\l"] - 87 -> 119 [style=solid label="tPV"] - 87 -> 120 [style=solid label="tCOMA"] - 87 -> 121 [style=dashed label="FinDecl"] - 88 [label="État 88\n\l 85 SuiteDeclConst: tID . tEQ E\l"] - 88 -> 122 [style=solid label="tEQ"] - 89 [label="État 89\n\l 79 Decl: tCONST Type SuiteDeclConst . FinDeclConst\l"] - 89 -> 123 [style=solid label="tPV"] - 89 -> 124 [style=solid label="tCOMA"] - 89 -> 125 [style=dashed label="FinDeclConst"] - 90 [label="État 90\n\l 52 SuiteAffPointeur: tMUL tID .\l"] - 90 -> "90R52" [style=solid] - "90R52" [label="R52", fillcolor=3, shape=diamond, style=filled] - 91 [label="État 91\n\l 32 Invocation: tID tOBRACE $@6 . Params tCBRACE\l"] - 91 -> 68 [style=solid label="tOBRACE"] - 91 -> 69 [style=solid label="tMUL"] - 91 -> 70 [style=solid label="tSUB"] - 91 -> 71 [style=solid label="tNB"] - 91 -> 72 [style=solid label="tNBEXP"] - 91 -> 73 [style=solid label="tID"] - 91 -> 39 [style=solid label="tPRINTF"] - 91 -> 74 [style=solid label="tGET"] - 91 -> 75 [style=solid label="tADDR"] - 91 -> 76 [style=solid label="tNOT"] - 91 -> 77 [style=dashed label="Get"] - 91 -> 78 [style=dashed label="Invocation"] - 91 -> 126 [style=dashed label="Params"] - 91 -> 127 [style=dashed label="Param"] - 91 -> 128 [style=dashed label="E"] - 91 -> "91R34" [style=solid] - "91R34" [label="R34", fillcolor=3, shape=diamond, style=filled] - 92 [label="État 92\n\l 53 SuiteAffPointeur: tID tOCROCH E . tCCROCH\l 56 E: E . tMUL E\l 57 | E . tDIV E\l 58 | E . tSUB E\l 59 | E . tADD E\l 63 | E . tEQCOND E\l 64 | E . tGT E\l 65 | E . tLT E\l 67 | E . tAND E\l 68 | E . tOR E\l"] - 92 -> 129 [style=solid label="tCCROCH"] - 92 -> 106 [style=solid label="tMUL"] - 92 -> 107 [style=solid label="tDIV"] - 92 -> 108 [style=solid label="tADD"] - 92 -> 109 [style=solid label="tSUB"] - 92 -> 110 [style=solid label="tLT"] - 92 -> 111 [style=solid label="tGT"] - 92 -> 112 [style=solid label="tEQCOND"] - 92 -> 113 [style=solid label="tAND"] - 92 -> 114 [style=solid label="tOR"] - 93 [label="État 93\n\l 33 Invocation: tPRINTF tOBRACE E . tCBRACE\l 56 E: E . tMUL E\l 57 | E . tDIV E\l 58 | E . tSUB E\l 59 | E . tADD E\l 63 | E . tEQCOND E\l 64 | E . tGT E\l 65 | E . tLT E\l 67 | E . tAND E\l 68 | E . tOR E\l"] - 93 -> 130 [style=solid label="tCBRACE"] - 93 -> 106 [style=solid label="tMUL"] - 93 -> 107 [style=solid label="tDIV"] - 93 -> 108 [style=solid label="tADD"] - 93 -> 109 [style=solid label="tSUB"] - 93 -> 110 [style=solid label="tLT"] - 93 -> 111 [style=solid label="tGT"] - 93 -> 112 [style=solid label="tEQCOND"] - 93 -> 113 [style=solid label="tAND"] - 93 -> 114 [style=solid label="tOR"] - 94 [label="État 94\n\l 12 Stop: tSTOP tOBRACE tNB . tCBRACE\l"] - 94 -> 131 [style=solid label="tCBRACE"] - 95 [label="État 95\n\l 41 If: tIF tOBRACE E . tCBRACE $@7 Body $@8 Else\l 56 E: E . tMUL E\l 57 | E . tDIV E\l 58 | E . tSUB E\l 59 | E . tADD E\l 63 | E . tEQCOND E\l 64 | E . tGT E\l 65 | E . tLT E\l 67 | E . tAND E\l 68 | E . tOR E\l"] - 95 -> 132 [style=solid label="tCBRACE"] - 95 -> 106 [style=solid label="tMUL"] - 95 -> 107 [style=solid label="tDIV"] - 95 -> 108 [style=solid label="tADD"] - 95 -> 109 [style=solid label="tSUB"] - 95 -> 110 [style=solid label="tLT"] - 95 -> 111 [style=solid label="tGT"] - 95 -> 112 [style=solid label="tEQCOND"] - 95 -> 113 [style=solid label="tAND"] - 95 -> 114 [style=solid label="tOR"] - 96 [label="État 96\n\l 46 While: tWHILE tOBRACE E . tCBRACE $@9 Body\l 56 E: E . tMUL E\l 57 | E . tDIV E\l 58 | E . tSUB E\l 59 | E . tADD E\l 63 | E . tEQCOND E\l 64 | E . tGT E\l 65 | E . tLT E\l 67 | E . tAND E\l 68 | E . tOR E\l"] - 96 -> 133 [style=solid label="tCBRACE"] - 96 -> 106 [style=solid label="tMUL"] - 96 -> 107 [style=solid label="tDIV"] - 96 -> 108 [style=solid label="tADD"] - 96 -> 109 [style=solid label="tSUB"] - 96 -> 110 [style=solid label="tLT"] - 96 -> 111 [style=solid label="tGT"] - 96 -> 112 [style=solid label="tEQCOND"] - 96 -> 113 [style=solid label="tAND"] - 96 -> 114 [style=solid label="tOR"] - 97 [label="État 97\n\l 56 E: E . tMUL E\l 57 | E . tDIV E\l 58 | E . tSUB E\l 59 | E . tADD E\l 61 | tOBRACE E . tCBRACE\l 63 | E . tEQCOND E\l 64 | E . tGT E\l 65 | E . tLT E\l 67 | E . tAND E\l 68 | E . tOR E\l"] - 97 -> 134 [style=solid label="tCBRACE"] - 97 -> 106 [style=solid label="tMUL"] - 97 -> 107 [style=solid label="tDIV"] - 97 -> 108 [style=solid label="tADD"] - 97 -> 109 [style=solid label="tSUB"] - 97 -> 110 [style=solid label="tLT"] - 97 -> 111 [style=solid label="tGT"] - 97 -> 112 [style=solid label="tEQCOND"] - 97 -> 113 [style=solid label="tAND"] - 97 -> 114 [style=solid label="tOR"] - 98 [label="État 98\n\l 56 E: E . tMUL E\l 57 | E . tDIV E\l 58 | E . tSUB E\l 59 | E . tADD E\l 63 | E . tEQCOND E\l 64 | E . tGT E\l 65 | E . tLT E\l 67 | E . tAND E\l 68 | E . tOR E\l 69 | tMUL E .\l"] - 98 -> "98R69" [style=solid] - "98R69" [label="R69", fillcolor=3, shape=diamond, style=filled] - 99 [label="État 99\n\l 56 E: E . tMUL E\l 57 | E . tDIV E\l 58 | E . tSUB E\l 59 | E . tADD E\l 62 | tSUB E .\l 63 | E . tEQCOND E\l 64 | E . tGT E\l 65 | E . tLT E\l 67 | E . tAND E\l 68 | E . tOR E\l"] - 99 -> 106 [style=solid label="tMUL"] - 99 -> 107 [style=solid label="tDIV"] - 99 -> "99R62" [style=solid] - "99R62" [label="R62", fillcolor=3, shape=diamond, style=filled] - 100 [label="État 100\n\l 71 E: tID tOCROCH . E tCCROCH\l"] - 100 -> 68 [style=solid label="tOBRACE"] - 100 -> 69 [style=solid label="tMUL"] - 100 -> 70 [style=solid label="tSUB"] - 100 -> 71 [style=solid label="tNB"] - 100 -> 72 [style=solid label="tNBEXP"] - 100 -> 73 [style=solid label="tID"] - 100 -> 39 [style=solid label="tPRINTF"] - 100 -> 74 [style=solid label="tGET"] - 100 -> 75 [style=solid label="tADDR"] - 100 -> 76 [style=solid label="tNOT"] - 100 -> 77 [style=dashed label="Get"] - 100 -> 78 [style=dashed label="Invocation"] - 100 -> 135 [style=dashed label="E"] - 101 [label="État 101\n\l 11 Get: tGET tOBRACE . tCBRACE\l"] - 101 -> 136 [style=solid label="tCBRACE"] - 102 [label="État 102\n\l 74 EBis: tID . tOCROCH E tCCROCH\l 75 | tID .\l"] - 102 -> 137 [style=solid label="tOCROCH"] - 102 -> "102R75" [style=solid] - "102R75" [label="R75", fillcolor=3, shape=diamond, style=filled] - 103 [label="État 103\n\l 72 E: tADDR EBis .\l"] - 103 -> "103R72" [style=solid] - "103R72" [label="R72", fillcolor=3, shape=diamond, style=filled] - 104 [label="État 104\n\l 56 E: E . tMUL E\l 57 | E . tDIV E\l 58 | E . tSUB E\l 59 | E . tADD E\l 63 | E . tEQCOND E\l 64 | E . tGT E\l 65 | E . tLT E\l 66 | tNOT E .\l 67 | E . tAND E\l 68 | E . tOR E\l"] - 104 -> 106 [style=solid label="tMUL"] - 104 -> 107 [style=solid label="tDIV"] - 104 -> 108 [style=solid label="tADD"] - 104 -> 109 [style=solid label="tSUB"] - 104 -> "104R66" [style=solid] - "104R66" [label="R66", fillcolor=3, shape=diamond, style=filled] - 105 [label="État 105\n\l 13 Return: tRETURN E tPV .\l"] - 105 -> "105R13" [style=solid] - "105R13" [label="R13", fillcolor=3, shape=diamond, style=filled] - 106 [label="État 106\n\l 56 E: E tMUL . E\l"] - 106 -> 68 [style=solid label="tOBRACE"] - 106 -> 69 [style=solid label="tMUL"] - 106 -> 70 [style=solid label="tSUB"] - 106 -> 71 [style=solid label="tNB"] - 106 -> 72 [style=solid label="tNBEXP"] - 106 -> 73 [style=solid label="tID"] - 106 -> 39 [style=solid label="tPRINTF"] - 106 -> 74 [style=solid label="tGET"] - 106 -> 75 [style=solid label="tADDR"] - 106 -> 76 [style=solid label="tNOT"] - 106 -> 77 [style=dashed label="Get"] - 106 -> 78 [style=dashed label="Invocation"] - 106 -> 138 [style=dashed label="E"] - 107 [label="État 107\n\l 57 E: E tDIV . E\l"] - 107 -> 68 [style=solid label="tOBRACE"] - 107 -> 69 [style=solid label="tMUL"] - 107 -> 70 [style=solid label="tSUB"] - 107 -> 71 [style=solid label="tNB"] - 107 -> 72 [style=solid label="tNBEXP"] - 107 -> 73 [style=solid label="tID"] - 107 -> 39 [style=solid label="tPRINTF"] - 107 -> 74 [style=solid label="tGET"] - 107 -> 75 [style=solid label="tADDR"] - 107 -> 76 [style=solid label="tNOT"] - 107 -> 77 [style=dashed label="Get"] - 107 -> 78 [style=dashed label="Invocation"] - 107 -> 139 [style=dashed label="E"] - 108 [label="État 108\n\l 59 E: E tADD . E\l"] - 108 -> 68 [style=solid label="tOBRACE"] - 108 -> 69 [style=solid label="tMUL"] - 108 -> 70 [style=solid label="tSUB"] - 108 -> 71 [style=solid label="tNB"] - 108 -> 72 [style=solid label="tNBEXP"] - 108 -> 73 [style=solid label="tID"] - 108 -> 39 [style=solid label="tPRINTF"] - 108 -> 74 [style=solid label="tGET"] - 108 -> 75 [style=solid label="tADDR"] - 108 -> 76 [style=solid label="tNOT"] - 108 -> 77 [style=dashed label="Get"] - 108 -> 78 [style=dashed label="Invocation"] - 108 -> 140 [style=dashed label="E"] - 109 [label="État 109\n\l 58 E: E tSUB . E\l"] - 109 -> 68 [style=solid label="tOBRACE"] - 109 -> 69 [style=solid label="tMUL"] - 109 -> 70 [style=solid label="tSUB"] - 109 -> 71 [style=solid label="tNB"] - 109 -> 72 [style=solid label="tNBEXP"] - 109 -> 73 [style=solid label="tID"] - 109 -> 39 [style=solid label="tPRINTF"] - 109 -> 74 [style=solid label="tGET"] - 109 -> 75 [style=solid label="tADDR"] - 109 -> 76 [style=solid label="tNOT"] - 109 -> 77 [style=dashed label="Get"] - 109 -> 78 [style=dashed label="Invocation"] - 109 -> 141 [style=dashed label="E"] - 110 [label="État 110\n\l 65 E: E tLT . E\l"] - 110 -> 68 [style=solid label="tOBRACE"] - 110 -> 69 [style=solid label="tMUL"] - 110 -> 70 [style=solid label="tSUB"] - 110 -> 71 [style=solid label="tNB"] - 110 -> 72 [style=solid label="tNBEXP"] - 110 -> 73 [style=solid label="tID"] - 110 -> 39 [style=solid label="tPRINTF"] - 110 -> 74 [style=solid label="tGET"] - 110 -> 75 [style=solid label="tADDR"] - 110 -> 76 [style=solid label="tNOT"] - 110 -> 77 [style=dashed label="Get"] - 110 -> 78 [style=dashed label="Invocation"] - 110 -> 142 [style=dashed label="E"] - 111 [label="État 111\n\l 64 E: E tGT . E\l"] - 111 -> 68 [style=solid label="tOBRACE"] - 111 -> 69 [style=solid label="tMUL"] - 111 -> 70 [style=solid label="tSUB"] - 111 -> 71 [style=solid label="tNB"] - 111 -> 72 [style=solid label="tNBEXP"] - 111 -> 73 [style=solid label="tID"] - 111 -> 39 [style=solid label="tPRINTF"] - 111 -> 74 [style=solid label="tGET"] - 111 -> 75 [style=solid label="tADDR"] - 111 -> 76 [style=solid label="tNOT"] - 111 -> 77 [style=dashed label="Get"] - 111 -> 78 [style=dashed label="Invocation"] - 111 -> 143 [style=dashed label="E"] - 112 [label="État 112\n\l 63 E: E tEQCOND . E\l"] - 112 -> 68 [style=solid label="tOBRACE"] - 112 -> 69 [style=solid label="tMUL"] - 112 -> 70 [style=solid label="tSUB"] - 112 -> 71 [style=solid label="tNB"] - 112 -> 72 [style=solid label="tNBEXP"] - 112 -> 73 [style=solid label="tID"] - 112 -> 39 [style=solid label="tPRINTF"] - 112 -> 74 [style=solid label="tGET"] - 112 -> 75 [style=solid label="tADDR"] - 112 -> 76 [style=solid label="tNOT"] - 112 -> 77 [style=dashed label="Get"] - 112 -> 78 [style=dashed label="Invocation"] - 112 -> 144 [style=dashed label="E"] - 113 [label="État 113\n\l 67 E: E tAND . E\l"] - 113 -> 68 [style=solid label="tOBRACE"] - 113 -> 69 [style=solid label="tMUL"] - 113 -> 70 [style=solid label="tSUB"] - 113 -> 71 [style=solid label="tNB"] - 113 -> 72 [style=solid label="tNBEXP"] - 113 -> 73 [style=solid label="tID"] - 113 -> 39 [style=solid label="tPRINTF"] - 113 -> 74 [style=solid label="tGET"] - 113 -> 75 [style=solid label="tADDR"] - 113 -> 76 [style=solid label="tNOT"] - 113 -> 77 [style=dashed label="Get"] - 113 -> 78 [style=dashed label="Invocation"] - 113 -> 145 [style=dashed label="E"] - 114 [label="État 114\n\l 68 E: E tOR . E\l"] - 114 -> 68 [style=solid label="tOBRACE"] - 114 -> 69 [style=solid label="tMUL"] - 114 -> 70 [style=solid label="tSUB"] - 114 -> 71 [style=solid label="tNB"] - 114 -> 72 [style=solid label="tNBEXP"] - 114 -> 73 [style=solid label="tID"] - 114 -> 39 [style=solid label="tPRINTF"] - 114 -> 74 [style=solid label="tGET"] - 114 -> 75 [style=solid label="tADDR"] - 114 -> 76 [style=solid label="tNOT"] - 114 -> 77 [style=dashed label="Get"] - 114 -> 78 [style=dashed label="Invocation"] - 114 -> 146 [style=dashed label="E"] - 115 [label="État 115\n\l 47 Aff: DebutAff tEQ E . tPV\l 56 E: E . tMUL E\l 57 | E . tDIV E\l 58 | E . tSUB E\l 59 | E . tADD E\l 63 | E . tEQCOND E\l 64 | E . tGT E\l 65 | E . tLT E\l 67 | E . tAND E\l 68 | E . tOR E\l"] - 115 -> 147 [style=solid label="tPV"] - 115 -> 106 [style=solid label="tMUL"] - 115 -> 107 [style=solid label="tDIV"] - 115 -> 108 [style=solid label="tADD"] - 115 -> 109 [style=solid label="tSUB"] - 115 -> 110 [style=solid label="tLT"] - 115 -> 111 [style=solid label="tGT"] - 115 -> 112 [style=solid label="tEQCOND"] - 115 -> 113 [style=solid label="tAND"] - 115 -> 114 [style=solid label="tOR"] - 116 [label="État 116\n\l 48 Aff: DebutAffPointeur tEQ E . tPV\l 56 E: E . tMUL E\l 57 | E . tDIV E\l 58 | E . tSUB E\l 59 | E . tADD E\l 63 | E . tEQCOND E\l 64 | E . tGT E\l 65 | E . tLT E\l 67 | E . tAND E\l 68 | E . tOR E\l"] - 116 -> 148 [style=solid label="tPV"] - 116 -> 106 [style=solid label="tMUL"] - 116 -> 107 [style=solid label="tDIV"] - 116 -> 108 [style=solid label="tADD"] - 116 -> 109 [style=solid label="tSUB"] - 116 -> 110 [style=solid label="tLT"] - 116 -> 111 [style=solid label="tGT"] - 116 -> 112 [style=solid label="tEQCOND"] - 116 -> 113 [style=solid label="tAND"] - 116 -> 114 [style=solid label="tOR"] - 117 [label="État 117\n\l 82 SuiteDecl: tID tOCROCH . tNB tCCROCH\l"] - 117 -> 149 [style=solid label="tNB"] - 118 [label="État 118\n\l 81 SuiteDecl: tID tEQ . E\l"] - 118 -> 68 [style=solid label="tOBRACE"] - 118 -> 69 [style=solid label="tMUL"] - 118 -> 70 [style=solid label="tSUB"] - 118 -> 71 [style=solid label="tNB"] - 118 -> 72 [style=solid label="tNBEXP"] - 118 -> 73 [style=solid label="tID"] - 118 -> 39 [style=solid label="tPRINTF"] - 118 -> 74 [style=solid label="tGET"] - 118 -> 75 [style=solid label="tADDR"] - 118 -> 76 [style=solid label="tNOT"] - 118 -> 77 [style=dashed label="Get"] - 118 -> 78 [style=dashed label="Invocation"] - 118 -> 150 [style=dashed label="E"] - 119 [label="État 119\n\l 83 FinDecl: tPV .\l"] - 119 -> "119R83" [style=solid] - "119R83" [label="R83", fillcolor=3, shape=diamond, style=filled] - 120 [label="État 120\n\l 84 FinDecl: tCOMA . SuiteDecl FinDecl\l"] - 120 -> 86 [style=solid label="tID"] - 120 -> 151 [style=dashed label="SuiteDecl"] - 121 [label="État 121\n\l 78 Decl: Type SuiteDecl FinDecl .\l"] - 121 -> "121R78" [style=solid] - "121R78" [label="R78", fillcolor=3, shape=diamond, style=filled] - 122 [label="État 122\n\l 85 SuiteDeclConst: tID tEQ . E\l"] - 122 -> 68 [style=solid label="tOBRACE"] - 122 -> 69 [style=solid label="tMUL"] - 122 -> 70 [style=solid label="tSUB"] - 122 -> 71 [style=solid label="tNB"] - 122 -> 72 [style=solid label="tNBEXP"] - 122 -> 73 [style=solid label="tID"] - 122 -> 39 [style=solid label="tPRINTF"] - 122 -> 74 [style=solid label="tGET"] - 122 -> 75 [style=solid label="tADDR"] - 122 -> 76 [style=solid label="tNOT"] - 122 -> 77 [style=dashed label="Get"] - 122 -> 78 [style=dashed label="Invocation"] - 122 -> 152 [style=dashed label="E"] - 123 [label="État 123\n\l 86 FinDeclConst: tPV .\l"] - 123 -> "123R86" [style=solid] - "123R86" [label="R86", fillcolor=3, shape=diamond, style=filled] - 124 [label="État 124\n\l 87 FinDeclConst: tCOMA . SuiteDeclConst FinDeclConst\l"] - 124 -> 88 [style=solid label="tID"] - 124 -> 153 [style=dashed label="SuiteDeclConst"] - 125 [label="État 125\n\l 79 Decl: tCONST Type SuiteDeclConst FinDeclConst .\l"] - 125 -> "125R79" [style=solid] - "125R79" [label="R79", fillcolor=3, shape=diamond, style=filled] - 126 [label="État 126\n\l 32 Invocation: tID tOBRACE $@6 Params . tCBRACE\l"] - 126 -> 154 [style=solid label="tCBRACE"] - 127 [label="État 127\n\l 35 Params: Param . SuiteParams\l"] - 127 -> 155 [style=solid label="tCOMA"] - 127 -> 156 [style=dashed label="SuiteParams"] - 127 -> "127R38" [style=solid] - "127R38" [label="R38", fillcolor=3, shape=diamond, style=filled] - 128 [label="État 128\n\l 36 Param: E .\l 56 E: E . tMUL E\l 57 | E . tDIV E\l 58 | E . tSUB E\l 59 | E . tADD E\l 63 | E . tEQCOND E\l 64 | E . tGT E\l 65 | E . tLT E\l 67 | E . tAND E\l 68 | E . tOR E\l"] - 128 -> 106 [style=solid label="tMUL"] - 128 -> 107 [style=solid label="tDIV"] - 128 -> 108 [style=solid label="tADD"] - 128 -> 109 [style=solid label="tSUB"] - 128 -> 110 [style=solid label="tLT"] - 128 -> 111 [style=solid label="tGT"] - 128 -> 112 [style=solid label="tEQCOND"] - 128 -> 113 [style=solid label="tAND"] - 128 -> 114 [style=solid label="tOR"] - 128 -> "128R36" [style=solid] - "128R36" [label="R36", fillcolor=3, shape=diamond, style=filled] - 129 [label="État 129\n\l 53 SuiteAffPointeur: tID tOCROCH E tCCROCH .\l"] - 129 -> "129R53" [style=solid] - "129R53" [label="R53", fillcolor=3, shape=diamond, style=filled] - 130 [label="État 130\n\l 33 Invocation: tPRINTF tOBRACE E tCBRACE .\l"] - 130 -> "130R33" [style=solid] - "130R33" [label="R33", fillcolor=3, shape=diamond, style=filled] - 131 [label="État 131\n\l 12 Stop: tSTOP tOBRACE tNB tCBRACE .\l"] - 131 -> "131R12" [style=solid] - "131R12" [label="R12", fillcolor=3, shape=diamond, style=filled] - 132 [label="État 132\n\l 41 If: tIF tOBRACE E tCBRACE . $@7 Body $@8 Else\l"] - 132 -> 157 [style=dashed label="$@7"] - 132 -> "132R39" [style=solid] - "132R39" [label="R39", fillcolor=3, shape=diamond, style=filled] - 133 [label="État 133\n\l 46 While: tWHILE tOBRACE E tCBRACE . $@9 Body\l"] - 133 -> 158 [style=dashed label="$@9"] - 133 -> "133R45" [style=solid] - "133R45" [label="R45", fillcolor=3, shape=diamond, style=filled] - 134 [label="État 134\n\l 61 E: tOBRACE E tCBRACE .\l"] - 134 -> "134R61" [style=solid] - "134R61" [label="R61", fillcolor=3, shape=diamond, style=filled] - 135 [label="État 135\n\l 56 E: E . tMUL E\l 57 | E . tDIV E\l 58 | E . tSUB E\l 59 | E . tADD E\l 63 | E . tEQCOND E\l 64 | E . tGT E\l 65 | E . tLT E\l 67 | E . tAND E\l 68 | E . tOR E\l 71 | tID tOCROCH E . tCCROCH\l"] - 135 -> 159 [style=solid label="tCCROCH"] - 135 -> 106 [style=solid label="tMUL"] - 135 -> 107 [style=solid label="tDIV"] - 135 -> 108 [style=solid label="tADD"] - 135 -> 109 [style=solid label="tSUB"] - 135 -> 110 [style=solid label="tLT"] - 135 -> 111 [style=solid label="tGT"] - 135 -> 112 [style=solid label="tEQCOND"] - 135 -> 113 [style=solid label="tAND"] - 135 -> 114 [style=solid label="tOR"] - 136 [label="État 136\n\l 11 Get: tGET tOBRACE tCBRACE .\l"] - 136 -> "136R11" [style=solid] - "136R11" [label="R11", fillcolor=3, shape=diamond, style=filled] - 137 [label="État 137\n\l 74 EBis: tID tOCROCH . E tCCROCH\l"] - 137 -> 68 [style=solid label="tOBRACE"] - 137 -> 69 [style=solid label="tMUL"] - 137 -> 70 [style=solid label="tSUB"] - 137 -> 71 [style=solid label="tNB"] - 137 -> 72 [style=solid label="tNBEXP"] - 137 -> 73 [style=solid label="tID"] - 137 -> 39 [style=solid label="tPRINTF"] - 137 -> 74 [style=solid label="tGET"] - 137 -> 75 [style=solid label="tADDR"] - 137 -> 76 [style=solid label="tNOT"] - 137 -> 77 [style=dashed label="Get"] - 137 -> 78 [style=dashed label="Invocation"] - 137 -> 160 [style=dashed label="E"] - 138 [label="État 138\n\l 56 E: E . tMUL E\l 56 | E tMUL E .\l 57 | E . tDIV E\l 58 | E . tSUB E\l 59 | E . tADD E\l 63 | E . tEQCOND E\l 64 | E . tGT E\l 65 | E . tLT E\l 67 | E . tAND E\l 68 | E . tOR E\l"] - 138 -> "138R56" [style=solid] - "138R56" [label="R56", fillcolor=3, shape=diamond, style=filled] - 139 [label="État 139\n\l 56 E: E . tMUL E\l 57 | E . tDIV E\l 57 | E tDIV E .\l 58 | E . tSUB E\l 59 | E . tADD E\l 63 | E . tEQCOND E\l 64 | E . tGT E\l 65 | E . tLT E\l 67 | E . tAND E\l 68 | E . tOR E\l"] - 139 -> "139R57" [style=solid] - "139R57" [label="R57", fillcolor=3, shape=diamond, style=filled] - 140 [label="État 140\n\l 56 E: E . tMUL E\l 57 | E . tDIV E\l 58 | E . tSUB E\l 59 | E . tADD E\l 59 | E tADD E .\l 63 | E . tEQCOND E\l 64 | E . tGT E\l 65 | E . tLT E\l 67 | E . tAND E\l 68 | E . tOR E\l"] - 140 -> 106 [style=solid label="tMUL"] - 140 -> 107 [style=solid label="tDIV"] - 140 -> "140R59" [style=solid] - "140R59" [label="R59", fillcolor=3, shape=diamond, style=filled] - 141 [label="État 141\n\l 56 E: E . tMUL E\l 57 | E . tDIV E\l 58 | E . tSUB E\l 58 | E tSUB E .\l 59 | E . tADD E\l 63 | E . tEQCOND E\l 64 | E . tGT E\l 65 | E . tLT E\l 67 | E . tAND E\l 68 | E . tOR E\l"] - 141 -> 106 [style=solid label="tMUL"] - 141 -> 107 [style=solid label="tDIV"] - 141 -> "141R58" [style=solid] - "141R58" [label="R58", fillcolor=3, shape=diamond, style=filled] - 142 [label="État 142\n\l 56 E: E . tMUL E\l 57 | E . tDIV E\l 58 | E . tSUB E\l 59 | E . tADD E\l 63 | E . tEQCOND E\l 64 | E . tGT E\l 65 | E . tLT E\l 65 | E tLT E .\l 67 | E . tAND E\l 68 | E . tOR E\l"] - 142 -> 106 [style=solid label="tMUL"] - 142 -> 107 [style=solid label="tDIV"] - 142 -> 108 [style=solid label="tADD"] - 142 -> 109 [style=solid label="tSUB"] - 142 -> 112 [style=solid label="tEQCOND"] - 142 -> 113 [style=solid label="tAND"] - 142 -> 114 [style=solid label="tOR"] - 142 -> "142R65" [style=solid] - "142R65" [label="R65", fillcolor=3, shape=diamond, style=filled] - 143 [label="État 143\n\l 56 E: E . tMUL E\l 57 | E . tDIV E\l 58 | E . tSUB E\l 59 | E . tADD E\l 63 | E . tEQCOND E\l 64 | E . tGT E\l 64 | E tGT E .\l 65 | E . tLT E\l 67 | E . tAND E\l 68 | E . tOR E\l"] - 143 -> 106 [style=solid label="tMUL"] - 143 -> 107 [style=solid label="tDIV"] - 143 -> 108 [style=solid label="tADD"] - 143 -> 109 [style=solid label="tSUB"] - 143 -> 112 [style=solid label="tEQCOND"] - 143 -> 113 [style=solid label="tAND"] - 143 -> 114 [style=solid label="tOR"] - 143 -> "143R64" [style=solid] - "143R64" [label="R64", fillcolor=3, shape=diamond, style=filled] - 144 [label="État 144\n\l 56 E: E . tMUL E\l 57 | E . tDIV E\l 58 | E . tSUB E\l 59 | E . tADD E\l 63 | E . tEQCOND E\l 63 | E tEQCOND E .\l 64 | E . tGT E\l 65 | E . tLT E\l 67 | E . tAND E\l 68 | E . tOR E\l"] - 144 -> 106 [style=solid label="tMUL"] - 144 -> 107 [style=solid label="tDIV"] - 144 -> 108 [style=solid label="tADD"] - 144 -> 109 [style=solid label="tSUB"] - 144 -> 113 [style=solid label="tAND"] - 144 -> 114 [style=solid label="tOR"] - 144 -> "144R63" [style=solid] - "144R63" [label="R63", fillcolor=3, shape=diamond, style=filled] - 145 [label="État 145\n\l 56 E: E . tMUL E\l 57 | E . tDIV E\l 58 | E . tSUB E\l 59 | E . tADD E\l 63 | E . tEQCOND E\l 64 | E . tGT E\l 65 | E . tLT E\l 67 | E . tAND E\l 67 | E tAND E .\l 68 | E . tOR E\l"] - 145 -> 106 [style=solid label="tMUL"] - 145 -> 107 [style=solid label="tDIV"] - 145 -> 108 [style=solid label="tADD"] - 145 -> 109 [style=solid label="tSUB"] - 145 -> "145R67" [style=solid] - "145R67" [label="R67", fillcolor=3, shape=diamond, style=filled] - 146 [label="État 146\n\l 56 E: E . tMUL E\l 57 | E . tDIV E\l 58 | E . tSUB E\l 59 | E . tADD E\l 63 | E . tEQCOND E\l 64 | E . tGT E\l 65 | E . tLT E\l 67 | E . tAND E\l 68 | E . tOR E\l 68 | E tOR E .\l"] - 146 -> 106 [style=solid label="tMUL"] - 146 -> 107 [style=solid label="tDIV"] - 146 -> 108 [style=solid label="tADD"] - 146 -> 109 [style=solid label="tSUB"] - 146 -> "146R68" [style=solid] - "146R68" [label="R68", fillcolor=3, shape=diamond, style=filled] - 147 [label="État 147\n\l 47 Aff: DebutAff tEQ E tPV .\l"] - 147 -> "147R47" [style=solid] - "147R47" [label="R47", fillcolor=3, shape=diamond, style=filled] - 148 [label="État 148\n\l 48 Aff: DebutAffPointeur tEQ E tPV .\l"] - 148 -> "148R48" [style=solid] - "148R48" [label="R48", fillcolor=3, shape=diamond, style=filled] - 149 [label="État 149\n\l 82 SuiteDecl: tID tOCROCH tNB . tCCROCH\l"] - 149 -> 161 [style=solid label="tCCROCH"] - 150 [label="État 150\n\l 56 E: E . tMUL E\l 57 | E . tDIV E\l 58 | E . tSUB E\l 59 | E . tADD E\l 63 | E . tEQCOND E\l 64 | E . tGT E\l 65 | E . tLT E\l 67 | E . tAND E\l 68 | E . tOR E\l 81 SuiteDecl: tID tEQ E .\l"] - 150 -> 106 [style=solid label="tMUL"] - 150 -> 107 [style=solid label="tDIV"] - 150 -> 108 [style=solid label="tADD"] - 150 -> 109 [style=solid label="tSUB"] - 150 -> 110 [style=solid label="tLT"] - 150 -> 111 [style=solid label="tGT"] - 150 -> 112 [style=solid label="tEQCOND"] - 150 -> 113 [style=solid label="tAND"] - 150 -> 114 [style=solid label="tOR"] - 150 -> "150R81" [style=solid] - "150R81" [label="R81", fillcolor=3, shape=diamond, style=filled] - 151 [label="État 151\n\l 84 FinDecl: tCOMA SuiteDecl . FinDecl\l"] - 151 -> 119 [style=solid label="tPV"] - 151 -> 120 [style=solid label="tCOMA"] - 151 -> 162 [style=dashed label="FinDecl"] - 152 [label="État 152\n\l 56 E: E . tMUL E\l 57 | E . tDIV E\l 58 | E . tSUB E\l 59 | E . tADD E\l 63 | E . tEQCOND E\l 64 | E . tGT E\l 65 | E . tLT E\l 67 | E . tAND E\l 68 | E . tOR E\l 85 SuiteDeclConst: tID tEQ E .\l"] - 152 -> 106 [style=solid label="tMUL"] - 152 -> 107 [style=solid label="tDIV"] - 152 -> 108 [style=solid label="tADD"] - 152 -> 109 [style=solid label="tSUB"] - 152 -> 110 [style=solid label="tLT"] - 152 -> 111 [style=solid label="tGT"] - 152 -> 112 [style=solid label="tEQCOND"] - 152 -> 113 [style=solid label="tAND"] - 152 -> 114 [style=solid label="tOR"] - 152 -> "152R85" [style=solid] - "152R85" [label="R85", fillcolor=3, shape=diamond, style=filled] - 153 [label="État 153\n\l 87 FinDeclConst: tCOMA SuiteDeclConst . FinDeclConst\l"] - 153 -> 123 [style=solid label="tPV"] - 153 -> 124 [style=solid label="tCOMA"] - 153 -> 163 [style=dashed label="FinDeclConst"] - 154 [label="État 154\n\l 32 Invocation: tID tOBRACE $@6 Params tCBRACE .\l"] - 154 -> "154R32" [style=solid] - "154R32" [label="R32", fillcolor=3, shape=diamond, style=filled] - 155 [label="État 155\n\l 37 SuiteParams: tCOMA . Param SuiteParams\l"] - 155 -> 68 [style=solid label="tOBRACE"] - 155 -> 69 [style=solid label="tMUL"] - 155 -> 70 [style=solid label="tSUB"] - 155 -> 71 [style=solid label="tNB"] - 155 -> 72 [style=solid label="tNBEXP"] - 155 -> 73 [style=solid label="tID"] - 155 -> 39 [style=solid label="tPRINTF"] - 155 -> 74 [style=solid label="tGET"] - 155 -> 75 [style=solid label="tADDR"] - 155 -> 76 [style=solid label="tNOT"] - 155 -> 77 [style=dashed label="Get"] - 155 -> 78 [style=dashed label="Invocation"] - 155 -> 164 [style=dashed label="Param"] - 155 -> 128 [style=dashed label="E"] - 156 [label="État 156\n\l 35 Params: Param SuiteParams .\l"] - 156 -> "156R35" [style=solid] - "156R35" [label="R35", fillcolor=3, shape=diamond, style=filled] - 157 [label="État 157\n\l 41 If: tIF tOBRACE E tCBRACE $@7 . Body $@8 Else\l"] - 157 -> 27 [style=solid label="tOBRACKET"] - 157 -> 165 [style=dashed label="Body"] - 158 [label="État 158\n\l 46 While: tWHILE tOBRACE E tCBRACE $@9 . Body\l"] - 158 -> 27 [style=solid label="tOBRACKET"] - 158 -> 166 [style=dashed label="Body"] - 159 [label="État 159\n\l 71 E: tID tOCROCH E tCCROCH .\l"] - 159 -> "159R71" [style=solid] - "159R71" [label="R71", fillcolor=3, shape=diamond, style=filled] - 160 [label="État 160\n\l 56 E: E . tMUL E\l 57 | E . tDIV E\l 58 | E . tSUB E\l 59 | E . tADD E\l 63 | E . tEQCOND E\l 64 | E . tGT E\l 65 | E . tLT E\l 67 | E . tAND E\l 68 | E . tOR E\l 74 EBis: tID tOCROCH E . tCCROCH\l"] - 160 -> 167 [style=solid label="tCCROCH"] - 160 -> 106 [style=solid label="tMUL"] - 160 -> 107 [style=solid label="tDIV"] - 160 -> 108 [style=solid label="tADD"] - 160 -> 109 [style=solid label="tSUB"] - 160 -> 110 [style=solid label="tLT"] - 160 -> 111 [style=solid label="tGT"] - 160 -> 112 [style=solid label="tEQCOND"] - 160 -> 113 [style=solid label="tAND"] - 160 -> 114 [style=solid label="tOR"] - 161 [label="État 161\n\l 82 SuiteDecl: tID tOCROCH tNB tCCROCH .\l"] - 161 -> "161R82" [style=solid] - "161R82" [label="R82", fillcolor=3, shape=diamond, style=filled] - 162 [label="État 162\n\l 84 FinDecl: tCOMA SuiteDecl FinDecl .\l"] - 162 -> "162R84" [style=solid] - "162R84" [label="R84", fillcolor=3, shape=diamond, style=filled] - 163 [label="État 163\n\l 87 FinDeclConst: tCOMA SuiteDeclConst FinDeclConst .\l"] - 163 -> "163R87" [style=solid] - "163R87" [label="R87", fillcolor=3, shape=diamond, style=filled] - 164 [label="État 164\n\l 37 SuiteParams: tCOMA Param . SuiteParams\l"] - 164 -> 155 [style=solid label="tCOMA"] - 164 -> 168 [style=dashed label="SuiteParams"] - 164 -> "164R38" [style=solid] - "164R38" [label="R38", fillcolor=3, shape=diamond, style=filled] - 165 [label="État 165\n\l 41 If: tIF tOBRACE E tCBRACE $@7 Body . $@8 Else\l"] - 165 -> 169 [style=dashed label="$@8"] - 165 -> "165R40" [style=solid] - "165R40" [label="R40", fillcolor=3, shape=diamond, style=filled] - 166 [label="État 166\n\l 46 While: tWHILE tOBRACE E tCBRACE $@9 Body .\l"] - 166 -> "166R46" [style=solid] - "166R46" [label="R46", fillcolor=3, shape=diamond, style=filled] - 167 [label="État 167\n\l 74 EBis: tID tOCROCH E tCCROCH .\l"] - 167 -> "167R74" [style=solid] - "167R74" [label="R74", fillcolor=3, shape=diamond, style=filled] - 168 [label="État 168\n\l 37 SuiteParams: tCOMA Param SuiteParams .\l"] - 168 -> "168R37" [style=solid] - "168R37" [label="R37", fillcolor=3, shape=diamond, style=filled] - 169 [label="État 169\n\l 41 If: tIF tOBRACE E tCBRACE $@7 Body $@8 . Else\l"] - 169 -> 170 [style=solid label="tELSE"] - 169 -> 171 [style=dashed label="Else"] - 169 -> "169R44" [style=solid] - "169R44" [label="R44", fillcolor=3, shape=diamond, style=filled] - 170 [label="État 170\n\l 42 Else: tELSE . If\l 43 | tELSE . Body\l"] - 170 -> 27 [style=solid label="tOBRACKET"] - 170 -> 41 [style=solid label="tIF"] - 170 -> 172 [style=dashed label="Body"] - 170 -> 173 [style=dashed label="If"] - 171 [label="État 171\n\l 41 If: tIF tOBRACE E tCBRACE $@7 Body $@8 Else .\l"] - 171 -> "171R41" [style=solid] - "171R41" [label="R41", fillcolor=3, shape=diamond, style=filled] - 172 [label="État 172\n\l 43 Else: tELSE Body .\l"] - 172 -> "172R43" [style=solid] - "172R43" [label="R43", fillcolor=3, shape=diamond, style=filled] - 173 [label="État 173\n\l 42 Else: tELSE If .\l"] - 173 -> "173R42" [style=solid] - "173R42" [label="R42", fillcolor=3, shape=diamond, style=filled] -} diff --git a/Lex_Yacc/as.y b/Lex_Yacc/as.y index 5b2e13e..4abd29a 100644 --- a/Lex_Yacc/as.y +++ b/Lex_Yacc/as.y @@ -14,12 +14,13 @@ struct type_t type_courant; struct type_t return_type_fonc; - +// Tableau pour le management des patchs des JMP int instructions_ligne_to_patch[10][20]; int nbs_instructions_to_patch[10]; %} +// Récupération des tokens %token tMAIN %token tOBRACKET tCBRACKET %token tOBRACE tCBRACE @@ -45,134 +46,411 @@ int nbs_instructions_to_patch[10]; %left tADD tSUB %left tMUL tDIV -%type E DebutAff SuiteAffPointeur DebutAffPointeur EBis Invocation Args ArgSuite Arg SuiteParams Params Get - - - -//%type E - -/******************************************** FAIRE LA GENERATION DU CODE ASSEMBLEUR DANS UN TABLEAU AVEC UN FPRINTF *******************/ +%type E SuiteAffPointeur DebutAffPointeur EBis Invocation Args ArgSuite Arg SuiteParams Params Get %% +/*************************************/ +/*************************************/ +/*********** Programme C *************/ +/*************************************/ +/*************************************/ + +// Un programme C correspond a des focntion et un main, une fois que le programme est compilé, on ajoute le STOP et l'on exporte l'assembleur. +C : Fonctions Main {add_operation(STOP,0,0,0); + create_asm(); + }; -C : Fonction Fonctions {add_operation(STOP,0,0,0); create_asm();}; + + + +/*************************************/ +/*************************************/ +/************ Fonctions **************/ +/*************************************/ +/*************************************/ + +// Des fonctions sont une suite de fonctions (possiblement nulle) Fonctions : Fonction Fonctions; Fonctions : ; -Main : tINT {printf("Déclaration du main\n"); create_jump_to_main(get_current_index());} tMAIN tOBRACE Args tCBRACE Body { print(); } ; - -Fonction : Type tID {return_type_fonc = type_courant; printf("Déclaration de la fonction %s\n", $2);} tOBRACE {inc_prof();} Args {decrement_prof(); push_fonction($2,return_type_fonc,get_current_index(), $6);} tCBRACE Body { print_fonctions(); add_operation(RET,0,0,0);} ; -Fonction : Main {print_fonctions();}; - -Get : tGET tOBRACE tCBRACE {int addr = push("0_TEMPORARY", 0, integer); add_operation(GET,addr,0,0); $$ = addr;}; - -Stop : tSTOP tOBRACE tNB tCBRACE {add_operation(STOP,$3,0,0);}; - -Return : tRETURN E tPV {add_operation(COP,0,$2,0); pop(); }; - -Args : Arg ArgSuite {$$ = $1 + $2; printf("Les arguments de la fonctions vont avoir une taille dans la pile de : %d\n",$$);}; -Args : {$$ = 0;}; -Arg : Type tID {int addr = push($2,1, type_courant); if (type_courant.pointeur_level > 0){$$ = taille_types[INT];} else{$$ = taille_types[type_courant.base];}}; -Arg : Type tID tOCROCH tCCROCH {type_courant.isTab = 2; int addr = push($2,1, type_courant); $$ = taille_types[INT];}; -ArgSuite : tCOMA Arg ArgSuite {$$ = $2 + $3;} ; -ArgSuite : {$$ = 0;}; -Body : tOBRACKET {inc_prof();} Instructions tCBRACKET {print(); reset_prof();}; +/*************************************/ +/*************************************/ +/************** Main *****************/ +/*************************************/ +/*************************************/ + +// Le main, renvoi un int, possède le mot clé main, des arguments et un body +// Dès que le main est reconnu (token main) on met en place le JMP +Main : tINT tMAIN {printf("Déclaration du main\n"); + create_jump_to_main(get_current_index()); + } + tOBRACE Args tCBRACE Body; + + +// Une fonction possède un Type , un identifiant +Fonction : Type tID {return_type_fonc = type_courant; // On récupère le ype de la fonction + printf("Déclaration de la fonction %s\n", $2); + } + tOBRACE {inc_prof(); // On incrémente la profondeur pour les arguments, ils font parti de la fonction + } + Args {decrement_prof(); // Quand les arguments sont passés, on peur décrémenter la profondeur (sans effacer les variables) + push_fonction($2,return_type_fonc,get_current_index(), $6); // On enregistre la fonction dans la table des fonctions + } + tCBRACE Body {add_operation(RET,0,0,0); // On ajoute le RET + }; + +// Get, une fonction particulière -> renvoi l'adresse de la valeur getée +Get : tGET tOBRACE tCBRACE {int addr = push("0_TEMPORARY", 0, integer); // On déclare la var temporelle + add_operation(GET,addr,0,0); // On ajoute le GET + $$ = addr; // On renvoi l'adresse + }; + +// Print, une fonction particulière +Print : tPRINTF tOBRACE E tCBRACE {add_operation(PRI,$3,0,0); // On ajoute l'instruction PRI + pop(); // On supprime la variable temporaire + }; + +// Stop, une fonction particulière +Stop : tSTOP tOBRACE tNB tCBRACE {add_operation(STOP,$3,0,0); // On ajoute juste l'instruction stop + }; + +// Return, etape clé d'une fonction +Return : tRETURN E tPV {add_operation(COP,0,$2,0); // On copie la valeur retournée à l'adresse 0 de la frame + pop(); // On pop la variable temporaire + }; + + + + + +/*************************************/ +/*************************************/ +/************ Arguments **************/ +/*************************************/ +/*************************************/ + +// Les arguments : Args, Arg, ArgSuite renvoient la taille dans la pile des arguments déjà reconnus +// Des argmuments correspondent à : un argument, puis la suite d'arguments +Args : Arg ArgSuite {$$ = $1 + $2; // La taille des arguments est la taille du premier argument plus celle des suivants + }; +Args : {$$ = 0; // Il peut ne pas y avoir d'arguments, alors la taille est 0 + }; +// Un argument possède un type et un identifiant (nom) +Arg : Type tID { int addr = push($2,1, type_courant); // On stocke l'argument dans la pile des symboles + if (type_courant.pointeur_level > 0) { + $$ = taille_types[ADDR]; + } else { + $$ = taille_types[type_courant.base]; + } + }; +// Un argument peut aussi être un tableau (argument classique et crochets) il est considéré comme un pointeur +Arg : Type tID tOCROCH tCCROCH {type_courant.pointeur_level++; // Considéré comme un simple pointeur + int addr = push($2,1, type_courant); + $$ = taille_types[ADDR]; + }; +// La suite d'un argument, une virgule, un argument, et d'autres arguments +ArgSuite : tCOMA Arg ArgSuite {$$ = $2 + $3; + }; +// Cela peut être aucun arguments +ArgSuite : {$$ = 0; + }; + + + + + +/*************************************/ +/*************************************/ +/*************** Body ****************/ +/*************************************/ +/*************************************/ + +// Un body n'est rien d'autre qu'une suite d'instructions entre deux accolades +Body : tOBRACKET {inc_prof(); // Lors de l'ouverture de l'accolade la profondeur augmente + } + Instructions tCBRACKET {reset_prof(); // A la sortie d'un body, on détruit toutes les variables locales de ce body + }; + + + + + + +/*************************************/ +/*************************************/ +/*********** Instructions ************/ +/*************************************/ +/*************************************/ + +// Des instructions sont une instruction suivie d'autres instructions, ou, rien Instructions : Instruction Instructions ; Instructions : ; -Instruction : Aff {}; -Instruction : Decl {}; -Instruction : Invocation tPV{pop();}; -Instruction : If {}; -Instruction : While {}; -Instruction : Return {}; -Instruction : Stop tPV {}; - -Invocation : tID tOBRACE {struct fonction_t fonc = get_fonction($1);} -Params tCBRACE {struct fonction_t fonc = get_fonction($1); multiple_pop($4); -add_operation(CALL,fonc.first_instruction_line, get_last_addr(),0); if (fonc.return_type.pointeur_level > 0 || fonc.return_type.isTab){ - $$ = push("0_TEMPORARY_RETURN", 0, integer); -} -else{ -$$ = push("0_TEMPORARY_RETURN", 0, fonc.return_type); -}}; - -Invocation : tPRINTF tOBRACE E tCBRACE{add_operation(PRI,$3,0,0);}; - -Params : {$$ = 0; printf("Sans Params\n"); } ; -Params : Param SuiteParams {$$ = $2 + 1;}; -Param : E {printf("Parametre : %d\n", $1);}; -SuiteParams : tCOMA Param SuiteParams {$$ = $3 + 1;}; -SuiteParams : {$$ = 0;}; +// Un instruction peut être : une affectation, une déclaration, une invocation, un if, un while, un return, une fonction particulière +Instruction : Aff; +Instruction : Decl; +Instruction : Invocation tPV {pop();}; +Instruction : If; +Instruction : While; +Instruction : Return; +Instruction : Stop tPV; +Instruction : Print tPV; -//On considère que la première ligne du code en ASM est la ligne 0 -If : tIF tOBRACE E tCBRACE { -add_operation(JMF,$3,0,0); $1 = get_current_index() - 1;} -Body {int current = get_current_index(); - patch($1,current + 1); - add_operation(JMP,0,0,0); - instructions_ligne_to_patch[get_prof()][nbs_instructions_to_patch[get_prof()]] = current; - nbs_instructions_to_patch[get_prof()]++; - pop();} -Else {printf("If reconnu\n");}; -Else : tELSE If { printf("Else if reconnu\n"); }; -Else : tELSE Body { printf("Else reconnu\n"); int current = get_current_index(); -for (int i = 0; i< nbs_instructions_to_patch[get_prof()]; i++){ - patch(instructions_ligne_to_patch[get_prof()][i],current); -} -nbs_instructions_to_patch[get_prof()] = 0; -}; -Else : {int current = get_current_index(); -for (int i = 0; i< nbs_instructions_to_patch[get_prof()]; i++){ - patch(instructions_ligne_to_patch[get_prof()][i],current); -} -nbs_instructions_to_patch[get_prof()] = 0;}; -While : tWHILE tOBRACE E tCBRACE { -add_operation(JMF,$3,0,0); -$1 = get_current_index() - 1; -pop();} +/*************************************/ +/*************************************/ +/************ Invocation *************/ +/*************************************/ +/*************************************/ -Body { printf("While reconnu\n"); -int current = get_current_index(); -patch($1,current + 1); -add_operation(JMP,$1,0,0);}; +Invocation : tID tOBRACE Params tCBRACE {struct fonction_t fonc = get_fonction($1); // On récupère la fonction + multiple_pop($3); // On pop les paramètres de la table des symboles + add_operation(CALL,fonc.first_instruction_line, get_last_addr(),0); // On écrit le CALL + // On renvoi l'adresse de la valeur retour de la fonction + if (fonc.return_type.pointeur_level > 0 || fonc.return_type.isTab) { + $$ = push("0_TEMPORARY_RETURN", 0, pointer); + } else { + $$ = push("0_TEMPORARY_RETURN", 0, fonc.return_type); + } + }; -Aff : DebutAff tEQ E tPV {add_operation(COP, $1, $3,0); pop();} ; -Aff : DebutAffPointeur tEQ E tPV {add_operation(WR,$1,$3,0); pop(); pop();}; - -DebutAff : tID {struct symbole_t * symbole = get_variable($1); symbole->initialized = 1; $$=symbole->adresse; printf("%s prend une valeur\n", $1);}; - -DebutAffPointeur : tMUL SuiteAffPointeur {add_operation(READ, $2, $2, 0); $$=$2;}; -DebutAffPointeur : SuiteAffPointeur {$$=$1;}; -SuiteAffPointeur : tMUL tID {struct symbole_t * symbole = get_variable($2); int addr = push("0_TEMPORARY", 1, symbole->type); add_operation(COP, addr,symbole->adresse,0); $$=addr;}; -SuiteAffPointeur : tID tOCROCH E tCCROCH {struct symbole_t * symbole = get_variable($1); int addr = push("0_TEMPORARY", 1, symbole->type); if (symbole->type.isTab == 2){add_operation(COP, addr,symbole->adresse,0);} else{add_operation(AFCA, addr,symbole->adresse,0);} int addr2 = push("0_TEMPORARY", 1, integer); add_operation(AFC, addr2, taille_types[symbole->type.base],0); add_operation(MUL,$3,addr2,$3); add_operation(ADD,$3,addr,$3); $$=$3; pop(); pop();}; -E : tNB { int addr = push("0_TEMPORARY", 1, integer); add_operation(AFC, addr,$1,0); $$ = addr;}; -E : tNBEXP { printf("Nombre exp\n"); int addr = push("0_TEMPORARY", 1, integer); add_operation(AFC, addr,$1,0); $$ = addr;}; -E : E tMUL E { printf("Mul\n"); add_operation(MUL,$1,$1,$3); $$ = $1; pop();}; -E : E tDIV E { printf("Div\n"); add_operation(DIV, $1,$1,$3); $$ = $1; pop();}; -E : E tSUB E { printf("Sub\n"); add_operation(SOU,$1,$1,$3); $$ = $1; pop();}; -E : E tADD E { printf("Add\n"); add_operation(ADD,$1,$1,$3); $$ = $1; pop();}; -E : Invocation {$$ = $1;}; -E : tOBRACE E tCBRACE { printf("Parentheses\n"); $$=$2;}; -E : tSUB E { printf("Moins\n"); int addr = push("0_TEMPORARY", 1, integer); add_operation(AFC, addr,0,0); add_operation(SOU, $2,$2,addr); $$ = $2; pop();}; -E : E tEQCOND E { printf("==\n"); add_operation(EQU,$1,$1,$3); $$ = $1; pop();}; -E : E tGT E { printf(">\n"); add_operation(SUP,$1,$1,$3); $$ = $1; pop();}; -E : E tLT E { printf("<\n"); add_operation(INF,$1,$1,$3); $$ = $1; pop();}; -E : tNOT E { printf("!\n"); }; + +/*************************************/ +/*************************************/ +/************ Paramètres *************/ +/*************************************/ +/*************************************/ + +// Ici aussi, 0, 1 ou plusieurs paramètres avec une suite paramètre pour prendre en compte la virgule, on renvoi le nombre de paramètres +Params : {$$ = 0; + }; +Params : Param SuiteParams {$$ = $2 + 1; + }; +Param : E +SuiteParams : tCOMA Param SuiteParams {$$ = $3 + 1;}; +SuiteParams : {$$ = 0;}; + + + + + + + +/*************************************/ +/*************************************/ +/******** Sauts conditionnels ********/ +/*************************************/ +/*************************************/ + +// Un if : le token, une expression entre parenthèse suivie d'un body et d'un else +If : tIF tOBRACE E tCBRACE {add_operation(JMF,$3,0,0); // On ajoute le JMF sans préciser la ligne du saut + $1 = get_current_index() - 1; // On stocke le numéro d'instruction à patcher + } + Body {int current = get_current_index(); // On récupère le numéro d'instrcution + patch($1,current + 1); // On patch le Jump en cas d'instruction fausse + add_operation(JMP,0,0,0); // JMP pour skip le else si on devait faire le body + instructions_ligne_to_patch[get_prof()][nbs_instructions_to_patch[get_prof()]] = current; // On spécifie que le JMP est a patcher + nbs_instructions_to_patch[get_prof()]++; + pop(); // On pop la condition du if + } + Else + +// Elsif +Else : tELSE If; + +// Else +Else : tELSE Body {int current = get_current_index(); + for (int i = 0; i< nbs_instructions_to_patch[get_prof()]; i++) { + patch(instructions_ligne_to_patch[get_prof()][i],current); // On patch après le else + } + nbs_instructions_to_patch[get_prof()] = 0; + }; + +// If sans else +Else : {int current = get_current_index(); + for (int i = 0; i< nbs_instructions_to_patch[get_prof()]; i++){ + patch(instructions_ligne_to_patch[get_prof()][i],current); // On patch après le else + } + nbs_instructions_to_patch[get_prof()] = 0; + }; + + + + + + +/*************************************/ +/*************************************/ +/************** Boucles **************/ +/*************************************/ +/*************************************/ + +While : tWHILE tOBRACE E tCBRACE {add_operation(JMF,$3,0,0); // Ecriture du JMF + $1 = get_current_index() - 1; // Enregistrement de la ligne a patch + pop(); // Pop de la condition + } + Body {int current = get_current_index(); // Patch du JMF apres le body + patch($1,current + 1); + add_operation(JMP,$1,0,0); // JMP au debut de la boucle + }; + + + + + + +/*************************************/ +/*************************************/ +/************ Affectations ***********/ // A RETRAVAILLER +/*************************************/ +/*************************************/ + +// Affectation simple +Aff : tID tEQ E tPV {struct symbole_t * symbole = get_variable($1); // On récupère le symbole + symbole->initialized = 1; // Le symbole devient initialisé + add_operation(COP, symbole->adresse, $3,0); // On affecte la valeur + pop(); // On pop l'expression + }; + +// Debut d'une affectation avec déreférencement de pointeur //////// A RETRAVAILLERRRRRR +DebutAffPointeur : tMUL SuiteAffPointeur {add_operation(READ, $2, $2, 0); + $$=$2; + }; + +DebutAffPointeur : SuiteAffPointeur {$$=$1; + }; + +SuiteAffPointeur : tMUL tID {struct symbole_t * symbole = get_variable($2); + int addr = push("0_TEMPORARY", 1, symbole->type); + add_operation(COP, addr,symbole->adresse,0); + $$=addr; + }; + +SuiteAffPointeur : tID tOCROCH E tCCROCH {struct symbole_t * symbole = get_variable($1); + int addr = push("0_TEMPORARY", 1, symbole->type); + if (symbole->type.isTab == 2) { + add_operation(COP, addr,symbole->adresse,0); + } else { + add_operation(AFCA, addr,symbole->adresse,0); + } + int addr2 = push("0_TEMPORARY", 1, integer); + add_operation(AFC, addr2, taille_types[symbole->type.base],0); + add_operation(MUL,$3,addr2,$3); + add_operation(ADD,$3,addr,$3); + $$=$3; + pop(); + pop(); + }; + + + +// Affectation sur un pointeur +Aff : DebutAffPointeur tEQ E tPV {add_operation(WR,$1,$3,0); + pop(); + pop(); + }; + + + + + + + + + + + + +/*************************************/ +/*************************************/ +/***** Expressions Arithmetiques *****/ +/*************************************/ +/*************************************/ + +// Pour une expression arithmétique, nous renvoyons toujours l'adresse du resultat + +// Un simple nombre +E : tNB {int addr = push("0_TEMPORARY", 1, integer); // On reserve la place de la variable temporaire + add_operation(AFC, addr,$1,0); // On Affecte la valeur a cette adresse + $$ = addr; // On renvoi l'adresse + }; + +// Un nombre sous forme XeY, même traitement qu'un nombre classique +E : tNBEXP {int addr = push("0_TEMPORARY", 1, integer); + add_operation(AFC, addr,$1,0); + $$ = addr; + }; + +// Une Multiplication +E : E tMUL E {add_operation(MUL,$1,$1,$3); // On Multiplie les valeurs et stockons le résultat dans la première variable temporaire + $$ = $1; // On renvoi l'adresse du resultat + pop(); // On libère la seconde variable temporaire + }; + +// Une Division (idem multiplication) +E : E tDIV E {add_operation(DIV, $1,$1,$3); + $$ = $1; + pop(); + }; + +// Une Soustraction (idem multiplication) +E : E tSUB E {add_operation(SOU,$1,$1,$3); + $$ = $1; + pop(); + }; + +// Une Addition (idem multiplication) +E : E tADD E {add_operation(ADD,$1,$1,$3); + $$ = $1; + pop(); + }; + +// Une invocation +E : Invocation {$$ = $1; // Une invocation renvoi déjà l'adresse, cette règle n'est qu'un cast d'Invocation en E + }; + +// Consomation de parenthèses +E : tOBRACE E tCBRACE {$$ = $2; // Cela permet de garantir la prioricité des expressions entre parenthèse + }; + +// Négatif --> -E <=> 0-E +E : tSUB E {int addr = push("0_TEMPORARY", 1, integer); // On réserve la variable temporaire pour le 0 + add_operation(AFC, addr,0,0); // On affecte le 0 + add_operation(SOU, $2, addr, $2); // On applique le 0-E + $$ = $2; // On renvoi l'adresse + pop(); // On libère la mémoire temporaire utilisée par 0 + }; + +E : E tEQCOND E {add_operation(EQU,$1,$1,$3); + $$ = $1; + pop(); + }; + +E : E tGT E {add_operation(SUP,$1,$1,$3); + $$ = $1; + pop(); + }; + +E : E tLT E {add_operation(INF,$1,$1,$3); + $$ = $1; + pop(); + }; + +E : tNOT E { printf("!\n"); }; + E : E tAND E {add_operation(MUL,$1,$1,$3); $$ = $1; pop();}; E : E tOR E {add_operation(ADD,$1,$1,$3); $$ = $1; pop();} ; E : tMUL E { add_operation(READ, $2, $2, 0); $$=$2;}; diff --git a/Makefile b/Makefile index 614da56..dff707e 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,11 @@ default : @echo "Spécifiez une cible" + + +########################### +### NETTOYAGE ### +########################### clean : clean_Symboles clean_Instructions clean_Lex_Yacc clean_Fonctions @rm -f rondoudou_gcc @rm -f output.txt @@ -20,6 +25,11 @@ clean_Fonctions: clean_Lex_Yacc: @rm -f Lex_Yacc/as.output Lex_Yacc/as.tab.* Lex_Yacc/lex.yy.* + + +########################### +### COMPILATION ### +########################### build : clean build_Symboles build_Instructions build_Lex_Yacc build_Fonctions gcc Lex_Yacc/as.tab.o Lex_Yacc/lex.yy.o Tables/Instructions/tab_instruc.o Tables/Symboles/table_symboles.o Tables/Fonctions/tab_fonctions.o -ll -o rondoudou_gcc @@ -38,6 +48,11 @@ build_Lex_Yacc: clean_Lex_Yacc gcc -c Lex_Yacc/as.tab.c -o Lex_Yacc/as.tab.o gcc -c Lex_Yacc/lex.yy.c -o Lex_Yacc/lex.yy.o + + +########################### +### TESTS ### +########################### test_Symboles: build_Symboles gcc -c Tables/Symboles/test.c -o Tables/Symboles/test.o gcc Tables/Symboles/test.o Tables/Symboles/table_symboles.o -o Tables/Symboles/test @@ -48,9 +63,19 @@ test_Instructions: build_Instructions gcc Tables/Instructions/test.o Tables/Instructions/tab_instruc.o -o Tables/Instructions/test Tables/Instructions/test +test_Fonctions: build_Fonctions + gcc -c Tables/Fonctions/test.c -o Tables/Fonctions/test.o + gcc Tables/Fonctions/test.o Tables/Fonctions/tab_fonctions.o -o Tables/Fonctions/test + Tables/Fonctions/test + test: build cat Fichiers_Tests/progC | ./rondoudou_gcc + + +########################### +### EDITION ### +########################### edit_Lex_Yacc: pluma Lex_Yacc/al.lex Lex_Yacc/as.y & diff --git a/Tables/Fonctions/tab_fonctions.c b/Tables/Fonctions/tab_fonctions.c index 3e465a5..5616507 100644 --- a/Tables/Fonctions/tab_fonctions.c +++ b/Tables/Fonctions/tab_fonctions.c @@ -1,9 +1,14 @@ #include "tab_fonctions.h" +#define MAX_TAILLE_FONC 50 + +// Table des fonctions struct fonction_t tab_fonctions[MAX_TAILLE_FONC]; +// Index dispo dans la table int indexTab = 0; +// Renvoi une fonction a partir de son nom struct fonction_t get_fonction(char * name){ int not_found = 1; int i = 0; @@ -18,6 +23,7 @@ struct fonction_t get_fonction(char * name){ return res; } +// Insere une fonction void push_fonction(char * name, struct type_t type, int line, int taille_args){ if (indexTab < MAX_TAILLE_FONC){ struct fonction_t fonc; @@ -31,6 +37,7 @@ void push_fonction(char * name, struct type_t type, int line, int taille_args){ } } +// Fonction d'affichage des fonctions connues void print_fonctions(){ printf("Affichage table des fonctions\n"); printf("\t Size : %d\n",indexTab); diff --git a/Tables/Fonctions/tab_fonctions.h b/Tables/Fonctions/tab_fonctions.h index ac32dc0..9dc0e65 100644 --- a/Tables/Fonctions/tab_fonctions.h +++ b/Tables/Fonctions/tab_fonctions.h @@ -7,8 +7,6 @@ #include #include -#define MAX_TAILLE_FONC 50 - //Struct dans le tableau qui permet d'identifier une fonction struct fonction_t { char * name; @@ -17,10 +15,11 @@ struct fonction_t { int taille_args; }; +// Renvoi les informations sur une fonction à partir de son nom struct fonction_t get_fonction(char * name); - +// Insere une fonction dans la table (déclare une fonction) void push_fonction(char * name, struct type_t type, int line, int taille_args); - +// Fonction d'affichage des fonctions connues void print_fonctions(); #endif diff --git a/Tables/Instructions/tab_instruc.c b/Tables/Instructions/tab_instruc.c index e1162dd..d83310c 100644 --- a/Tables/Instructions/tab_instruc.c +++ b/Tables/Instructions/tab_instruc.c @@ -1,7 +1,20 @@ #include "tab_instruc.h" +#define MAXTAILLE 1024 + +// Structure représentant une opération +struct operation_t { + enum opcode_t opcode; + int arg1; + int arg2; + int arg3; +}; + +// Index dans le tableau des instruction int current_index = 1; +// Tableau des instructions (programme en assembleur) struct operation_t tab_op[MAXTAILLE]; +// Insertion d'une opération dans le tableau void add_operation(enum opcode_t opcode, int arg1, int arg2, int arg3){ if (current_index == MAXTAILLE){ printf("Taillemax tableau operations atteinte\n"); @@ -13,12 +26,13 @@ void add_operation(enum opcode_t opcode, int arg1, int arg2, int arg3){ } } +// Les fonctions étant compilées en premiers, la première instruction du programme doit être un JMP vers le main void create_jump_to_main(int line){ struct operation_t new_op = {JMP,line, 0, 0}; tab_op[0] = new_op; } - +// Fonction traduisant une opération en assembleur char * get_asm_line_from_op(struct operation_t op){ char * buffer = malloc(sizeof(char)*200); switch (op.opcode){ @@ -73,16 +87,17 @@ char * get_asm_line_from_op(struct operation_t op){ case (RET): sprintf(buffer,"RET\n"); break; - case (GET): - sprintf(buffer,"GET %d\n",op.arg1); - break; - case (STOP): - sprintf(buffer,"STOP %d\n", op.arg1); - break; + case (GET): + sprintf(buffer,"GET %d\n",op.arg1); + break; + case (STOP): + sprintf(buffer,"STOP %d\n", op.arg1); + break; } return buffer; } +// Genere le code asm dans un fichier void create_asm(){ FILE * output = fopen("output.txt","w"); for (int i = 0; i < current_index; i++){ @@ -92,10 +107,11 @@ void create_asm(){ } } +// Renvoi l'index courrant dans le tableau int get_current_index(){return current_index;} - +// Permet de modifier un instruction à postériorie (pour les JMP) void patch(int index, int arg){ if (tab_op[index].opcode == JMP){ tab_op[index].arg1 = arg; diff --git a/Tables/Instructions/tab_instruc.h b/Tables/Instructions/tab_instruc.h index 4a6fb95..0d0953a 100644 --- a/Tables/Instructions/tab_instruc.h +++ b/Tables/Instructions/tab_instruc.h @@ -1,21 +1,15 @@ #ifndef TAB_INST_H #define TAB_INST_H -#define MAXTAILLE 1024 + #include #include #include +// Liste de codes des instruction enum opcode_t {ADD,MUL,SOU,DIV,COP,AFC,AFCA,JMP,JMF,INF,SUP,EQU,PRI,READ,WR,CALL,RET,GET,STOP}; -struct operation_t { - enum opcode_t opcode; - int arg1; - int arg2; - int arg3; -}; - //Ajoute une opération dans la table (à la fin) void add_operation(enum opcode_t opcode, int arg1, int arg2, int arg3); //Renvoi le prochain slot disponible diff --git a/Tables/Symboles/table_symboles.c b/Tables/Symboles/table_symboles.c index b727087..1983447 100644 --- a/Tables/Symboles/table_symboles.c +++ b/Tables/Symboles/table_symboles.c @@ -1,55 +1,35 @@ -/* TABLE DES SYMBOLE DU COMPILATEUR (PILE) - ------------------------------------------------------ -| symbole | adresse | type | initialisé | ------------------------------------------------------ -| | | | | -| | | | | -| | | | | -| i | 0x777756b8 | int | false | -| size | 0x777756b8 | int | true | ------------------------------------------------------ - -Types pour l'implémentation : - - enum type_t : [int] - - struct symbole : { - char nom[30]; - uintptr_t adresse; - enum type_t type; - char initialized; - } - -Opérations possible : - - init -> pile * -> void - - push -> symbole -> pile * -> void - - pop -> pile * -> symbole - - exist -> pile * -> symbole -> char - - initialized -> pile * -> symbole -> char */ - #include "table_symboles.h" #include #include #include -#define MAXADDR 1024*5 +// Première adresse disponible int last_addr = 0; -int temp_addr = MAXADDR; -int taille_types[] = {-1, 1}; +// Tableau indexé sur les types donnant leur tailles +int taille_types[] = {-1, 1, 1}; +// Pronfondeur dans le code (pour la visibilité des variables) int profondeur = 0; -int last_temp_var_size; -const struct type_t integer = {INT, 0, 1}; +// Constante pour les entiers +const struct type_t integer = {INT, 0, 1, 0}; +// Constante pour les pointeurs +const struct type_t pointer = {ADDR, 0, 1, 0}; +// Structure chainant les symboles struct element_t { struct symbole_t symbole; struct element_t * suivant; }; +// Structure de la pile des symboles struct pile_t { int taille; struct element_t * first; }; + +// Pile des symboles struct pile_t * pile; +// Fonction d'affichage pour un type char * type_to_string(struct type_t type) { char * star = "*"; char * resultat = malloc(sizeof(char)*20); @@ -64,6 +44,7 @@ char * type_to_string(struct type_t type) { return resultat; } +// Fonction d'affichage pour un symbole void print_symbole(struct symbole_t symbole) { char * type = type_to_string(symbole.type); if (symbole.initialized) { @@ -74,14 +55,14 @@ void print_symbole(struct symbole_t symbole) { free(type); } +// Initialisation de la pile void init (void) { - pile = malloc(sizeof(struct pile_t)); + pile = malloc(sizeof(struct pile_t)); pile->first = NULL; pile->taille = 0; } - - +// Fonction d'ajout d'un symbole à la pile int push(char * nom, int isInit, struct type_t type) { struct element_t * aux = malloc(sizeof(struct element_t)); struct symbole_t symbole = {"", last_addr, type, isInit,profondeur}; @@ -95,6 +76,7 @@ int push(char * nom, int isInit, struct type_t type) { return addr_var; } +// Fonction renvoyant et supprimant le premier symbole struct symbole_t pop() { struct symbole_t retour = {"", 0, UNKNOWN, 0, 0}; struct element_t * aux; @@ -109,14 +91,14 @@ struct symbole_t pop() { return retour; } - - +// Fonction supprimant les n premiers symboles void multiple_pop(int n){ for (int i =0; ifirst; @@ -132,6 +114,7 @@ struct symbole_t * get_variable(char * nom){ return retour; } +// Fonction d'affichage de la pile void print() { printf("Affichage de la Table des Symboles\n\tSize : %d\n\tContenu : \n", pile->taille); struct element_t * aux = pile->first; @@ -146,11 +129,17 @@ void print() { } } - +// Getteur sur la première adresse dispo (utile pour le CALL) int get_last_addr(){ return last_addr; } + + + +/********************************/ +/*** GESTION DE LA PROFONDEUR ***/ +/********************************/ void inc_prof() { profondeur++; } diff --git a/Tables/Symboles/table_symboles.h b/Tables/Symboles/table_symboles.h index d05f433..9707684 100644 --- a/Tables/Symboles/table_symboles.h +++ b/Tables/Symboles/table_symboles.h @@ -1,43 +1,9 @@ -/* TABLE DES SYMBOLE DU COMPILATEUR (PILE) - ------------------------------------------------------ -| symbole | adresse | type | initialisé | ------------------------------------------------------ -| | | | | -| | | | | -| | | | | -| i | 0x777756b8 | int | false | -| size | 0x777756b8 | int | true | ------------------------------------------------------ - -Types pour l'implémentation : - - enum type_t : [int] - - struct symbole : { - char nom[30]; - uintptr_t adresse; - enum type_t type; - char initialized; - } - -Opérations possible : - - init -> pile * -> void - - push -> symbole -> pile * -> void - - pop -> pile * -> symbole - - status -> nom -> pile -> char */ - #ifndef TAB_SYMB_H #define TAB_SYMB_H #include - - - - - - - /**************************************/ /**************************************/ /**** Gestion des types possibles ****/ @@ -45,7 +11,7 @@ Opérations possible : /**************************************/ //Enumération des types de base reconnus -enum base_type_t {UNKNOWN, INT}; +enum base_type_t {UNKNOWN, INT, ADDR}; //Table enregistrant la taille de ces types de bases (indexée sur les types) extern int taille_types[]; //Structure gérant les types @@ -54,17 +20,18 @@ struct type_t { enum base_type_t base; //Si la variable est un pointeur, on enregitre son niveau (nombre de *) int pointeur_level; - //Si il s'agit d'un tableau, on enregistre sa taille (nombre de cases) (même si c'est une variable on met quand même un nb_blocs à) - int nb_blocs; - //Si c'est un tableau addressale directement, cette valeur est à 1. Si c'est un pointeur vers un tableau, valeur à 2. - int isTab; + //Si il s'agit d'un tableau, on enregistre sa taille (nombre de cases) (même si c'est une variable on met quand même un nb_blocs à 1) + int nb_blocs; + //Si c'est un tableau cette valeur est à 1, 0 sinon. + int isTab; }; -//REtourne la représentation d'un type en string +//Retourne la représentation d'un type en string char * type_to_string(struct type_t type); //Constante pour les entiers extern const struct type_t integer; - +//Constante pour les pointeurs +extern const struct type_t pointer; /**************************************/ @@ -100,7 +67,7 @@ struct symbole_t { //Est il initialisé int initialized; //Sa profondeur de création - int profondeur; + int profondeur; }; //Fonction d'affichage d'un symbole @@ -124,7 +91,7 @@ void init(void); int push(char * nom, int isInit, struct type_t type); //Destruction et récupération du premier élément de la table struct symbole_t pop(); -//Destruction des n premiers elee=ments de la table des symboles +//Destruction des n premiers elements de la table des symboles void multiple_pop(int n); //Retourne la dernière adresse disponible int get_last_addr();