diff --git a/a.out b/a.out index 29ee846..1475c63 100755 Binary files a/a.out and b/a.out differ diff --git a/analyse_syntaxique.output b/analyse_syntaxique.output index 5cc7ded..4a0e4ea 100644 --- a/analyse_syntaxique.output +++ b/analyse_syntaxique.output @@ -59,28 +59,34 @@ Grammaire 35 SuiteArgs: tVIRGULE tVAR SuiteArgs 36 | %empty - 37 If: tIF tPO Cond tPF tAO Instructions tAF Else + 37 $@1: %empty - 38 Else: tELSE tAO Instructions tAF - 39 | tELSE tIF tPO Cond tPF tAO Instructions tAF Else + 38 $@2: %empty - 40 While: tWHILE tPO Cond tPF tAO Instructions tAF + 39 If: tIF tPO Cond tPF $@1 tAO Instructions tAF $@2 Else - 41 Cond: E tEGAL E - 42 | E tDIFF E - 43 | E tLT E - 44 | E tGT E - 45 | E tLTE E - 46 | E tGTE E - 47 | E tAND Cond - 48 | E tOR Cond - 49 | tNOT Cond + 40 Else: tELSE tAO Instructions tAF + 41 | %empty + 42 | tELSE tIF tPO Cond tPF tAO Instructions tAF Else - 50 Invocation: tVAR tPO Args tPF + 43 While: tWHILE tPO Cond tPF tAO Instructions tAF - 51 Print: tPRINT tPO tVAR tPF tPV + 44 Cond: E tEGAL E + 45 | E tDIFF E + 46 | E tLT E + 47 | E tGT E + 48 | E tLTE E + 49 | E tGTE E + 50 | E tAND Cond + 51 | E tOR Cond + 52 | tNOT Cond + 53 | E - 52 Return: tRETURN E tPV + 54 Invocation: tVAR tPO Args tPF + + 55 Print: tPRINT tPO tVAR tPF tPV + + 56 Return: tRETURN E tPV Terminaux, suivis des règles où ils apparaissent @@ -93,32 +99,32 @@ tADD (260) 26 tSUB (261) 28 30 tMUL (262) 27 tDIV (263) 29 -tPO (264) 1 32 37 39 40 50 51 -tPF (265) 1 32 37 39 40 50 51 -tAO (266) 7 37 38 39 40 -tAF (267) 7 37 38 39 40 +tPO (264) 1 32 39 42 43 54 55 +tPF (265) 1 32 39 42 43 54 55 +tAO (266) 7 39 40 42 43 +tAF (267) 7 39 40 42 43 tERROR (268) -tPV (269) 5 15 16 23 51 52 +tPV (269) 5 15 16 23 55 56 tVIRGULE (270) 5 17 35 tAFFECTATION (271) 21 23 -tEGAL (272) 41 -tDIFF (273) 42 -tLT (274) 43 -tGT (275) 44 -tGTE (276) 46 -tLTE (277) 45 +tEGAL (272) 44 +tDIFF (273) 45 +tLT (274) 46 +tGT (275) 47 +tGTE (276) 49 +tLTE (277) 48 tMAIN (278) 1 tINT (279) 1 4 19 20 -tPRINT (280) 51 -tRETURN (281) 52 -tOR (282) 48 -tAND (283) 47 -tIF (284) 37 39 -tELSE (285) 38 39 -tWHILE (286) 40 +tPRINT (280) 55 +tRETURN (281) 56 +tOR (282) 51 +tAND (283) 50 +tIF (284) 39 42 +tELSE (285) 40 42 +tWHILE (286) 43 tCONST (287) 20 -tVAR (288) 4 21 22 23 25 33 35 50 51 -tNOT (289) 49 +tVAR (288) 4 21 22 23 25 33 35 54 55 +tNOT (289) 52 Non-terminaux, suivis des règles où ils apparaissent @@ -136,7 +142,7 @@ SuiteParams (39) Body (40) à gauche: 7, à droite: 1 Instructions (41) - à gauche: 8 9, à droite: 7 8 37 38 39 40 + à gauche: 8 9, à droite: 7 8 39 40 42 43 Instruction (42) à gauche: 10 11 12 13 14 15, à droite: 8 Decl (43) @@ -151,26 +157,30 @@ Aff (47) à gauche: 23, à droite: 10 E (48) à gauche: 24 25 26 27 28 29 30 31 32, à droite: 21 23 26 27 28 - 29 30 32 41 42 43 44 45 46 47 48 52 + 29 30 32 44 45 46 47 48 49 50 51 53 56 Args (49) - à gauche: 33 34, à droite: 50 + à gauche: 33 34, à droite: 54 SuiteArgs (50) à gauche: 35 36, à droite: 33 35 If (51) - à gauche: 37, à droite: 11 -Else (52) - à gauche: 38 39, à droite: 37 39 -While (53) - à gauche: 40, à droite: 12 -Cond (54) - à gauche: 41 42 43 44 45 46 47 48 49, à droite: 37 39 40 47 48 - 49 -Invocation (55) - à gauche: 50, à droite: 15 31 -Print (56) - à gauche: 51, à droite: 13 -Return (57) - à gauche: 52, à droite: 7 + à gauche: 39, à droite: 11 +$@1 (52) + à gauche: 37, à droite: 39 +$@2 (53) + à gauche: 38, à droite: 39 +Else (54) + à gauche: 40 41 42, à droite: 39 42 +While (55) + à gauche: 43, à droite: 12 +Cond (56) + à gauche: 44 45 46 47 48 49 50 51 52 53, à droite: 39 42 43 50 + 51 52 +Invocation (57) + à gauche: 54, à droite: 15 31 +Print (58) + à gauche: 55, à droite: 13 +Return (59) + à gauche: 56, à droite: 7 État 0 @@ -330,21 +340,21 @@ Return (57) État 17 - 51 Print: tPRINT . tPO tVAR tPF tPV + 55 Print: tPRINT . tPO tVAR tPF tPV tPO décalage et aller à l'état 32 État 18 - 37 If: tIF . tPO Cond tPF tAO Instructions tAF Else + 39 If: tIF . tPO Cond tPF $@1 tAO Instructions tAF $@2 Else tPO décalage et aller à l'état 33 État 19 - 40 While: tWHILE . tPO Cond tPF tAO Instructions tAF + 43 While: tWHILE . tPO Cond tPF tAO Instructions tAF tPO décalage et aller à l'état 34 @@ -359,7 +369,7 @@ Return (57) État 21 23 Aff: tVAR . tAFFECTATION E tPV - 50 Invocation: tVAR . tPO Args tPF + 54 Invocation: tVAR . tPO Args tPF tPO décalage et aller à l'état 36 tAFFECTATION décalage et aller à l'état 37 @@ -458,14 +468,14 @@ Return (57) État 32 - 51 Print: tPRINT tPO . tVAR tPF tPV + 55 Print: tPRINT tPO . tVAR tPF tPV tVAR décalage et aller à l'état 45 État 33 - 37 If: tIF tPO . Cond tPF tAO Instructions tAF Else + 39 If: tIF tPO . Cond tPF $@1 tAO Instructions tAF $@2 Else tENTIER décalage et aller à l'état 46 tSUB décalage et aller à l'état 47 @@ -480,7 +490,7 @@ Return (57) État 34 - 40 While: tWHILE tPO . Cond tPF tAO Instructions tAF + 43 While: tWHILE tPO . Cond tPF tAO Instructions tAF tENTIER décalage et aller à l'état 46 tSUB décalage et aller à l'état 47 @@ -502,7 +512,7 @@ Return (57) État 36 - 50 Invocation: tVAR tPO . Args tPF + 54 Invocation: tVAR tPO . Args tPF tVAR décalage et aller à l'état 55 @@ -526,7 +536,7 @@ Return (57) État 38 - 52 Return: tRETURN . E tPV + 56 Return: tRETURN . E tPV tENTIER décalage et aller à l'état 46 tSUB décalage et aller à l'état 47 @@ -588,7 +598,7 @@ Return (57) État 45 - 51 Print: tPRINT tPO tVAR . tPF tPV + 55 Print: tPRINT tPO tVAR . tPF tPV tPF décalage et aller à l'état 63 @@ -629,7 +639,7 @@ Return (57) État 49 25 E: tVAR . - 50 Invocation: tVAR . tPO Args tPF + 54 Invocation: tVAR . tPO Args tPF tPO décalage et aller à l'état 36 @@ -638,7 +648,7 @@ Return (57) État 50 - 49 Cond: tNOT . Cond + 52 Cond: tNOT . Cond tENTIER décalage et aller à l'état 46 tSUB décalage et aller à l'état 47 @@ -657,14 +667,15 @@ Return (57) 27 | E . tMUL E 28 | E . tSUB E 29 | E . tDIV E - 41 Cond: E . tEGAL E - 42 | E . tDIFF E - 43 | E . tLT E - 44 | E . tGT E - 45 | E . tLTE E - 46 | E . tGTE E - 47 | E . tAND Cond - 48 | E . tOR Cond + 44 Cond: E . tEGAL E + 45 | E . tDIFF E + 46 | E . tLT E + 47 | E . tGT E + 48 | E . tLTE E + 49 | E . tGTE E + 50 | E . tAND Cond + 51 | E . tOR Cond + 53 | E . tADD décalage et aller à l'état 67 tSUB décalage et aller à l'état 68 @@ -679,10 +690,12 @@ Return (57) tOR décalage et aller à l'état 77 tAND décalage et aller à l'état 78 + $défaut réduction par utilisation de la règle 53 (Cond) + État 52 - 37 If: tIF tPO Cond . tPF tAO Instructions tAF Else + 39 If: tIF tPO Cond . tPF $@1 tAO Instructions tAF $@2 Else tPF décalage et aller à l'état 79 @@ -696,7 +709,7 @@ Return (57) État 54 - 40 While: tWHILE tPO Cond . tPF tAO Instructions tAF + 43 While: tWHILE tPO Cond . tPF tAO Instructions tAF tPF décalage et aller à l'état 80 @@ -714,7 +727,7 @@ Return (57) État 56 - 50 Invocation: tVAR tPO Args . tPF + 54 Invocation: tVAR tPO Args . tPF tPF décalage et aller à l'état 83 @@ -740,7 +753,7 @@ Return (57) 27 | E . tMUL E 28 | E . tSUB E 29 | E . tDIV E - 52 Return: tRETURN E . tPV + 56 Return: tRETURN E . tPV tADD décalage et aller à l'état 67 tSUB décalage et aller à l'état 68 @@ -787,7 +800,7 @@ Return (57) État 63 - 51 Print: tPRINT tPO tVAR tPF . tPV + 55 Print: tPRINT tPO tVAR tPF . tPV tPV décalage et aller à l'état 89 @@ -823,9 +836,9 @@ Return (57) État 66 - 49 Cond: tNOT Cond . + 52 Cond: tNOT Cond . - $défaut réduction par utilisation de la règle 49 (Cond) + $défaut réduction par utilisation de la règle 52 (Cond) État 67 @@ -882,7 +895,7 @@ Return (57) État 71 - 41 Cond: E tEGAL . E + 44 Cond: E tEGAL . E tENTIER décalage et aller à l'état 46 tSUB décalage et aller à l'état 47 @@ -895,7 +908,7 @@ Return (57) État 72 - 42 Cond: E tDIFF . E + 45 Cond: E tDIFF . E tENTIER décalage et aller à l'état 46 tSUB décalage et aller à l'état 47 @@ -908,7 +921,7 @@ Return (57) État 73 - 43 Cond: E tLT . E + 46 Cond: E tLT . E tENTIER décalage et aller à l'état 46 tSUB décalage et aller à l'état 47 @@ -921,7 +934,7 @@ Return (57) État 74 - 44 Cond: E tGT . E + 47 Cond: E tGT . E tENTIER décalage et aller à l'état 46 tSUB décalage et aller à l'état 47 @@ -934,7 +947,7 @@ Return (57) État 75 - 46 Cond: E tGTE . E + 49 Cond: E tGTE . E tENTIER décalage et aller à l'état 46 tSUB décalage et aller à l'état 47 @@ -947,7 +960,7 @@ Return (57) État 76 - 45 Cond: E tLTE . E + 48 Cond: E tLTE . E tENTIER décalage et aller à l'état 46 tSUB décalage et aller à l'état 47 @@ -960,7 +973,7 @@ Return (57) État 77 - 48 Cond: E tOR . Cond + 51 Cond: E tOR . Cond tENTIER décalage et aller à l'état 46 tSUB décalage et aller à l'état 47 @@ -975,7 +988,7 @@ Return (57) État 78 - 47 Cond: E tAND . Cond + 50 Cond: E tAND . Cond tENTIER décalage et aller à l'état 46 tSUB décalage et aller à l'état 47 @@ -990,14 +1003,16 @@ Return (57) État 79 - 37 If: tIF tPO Cond tPF . tAO Instructions tAF Else + 39 If: tIF tPO Cond tPF . $@1 tAO Instructions tAF $@2 Else - tAO décalage et aller à l'état 103 + $défaut réduction par utilisation de la règle 37 ($@1) + + $@1 aller à l'état 103 État 80 - 40 While: tWHILE tPO Cond tPF . tAO Instructions tAF + 43 While: tWHILE tPO Cond tPF . tAO Instructions tAF tAO décalage et aller à l'état 104 @@ -1018,9 +1033,9 @@ Return (57) État 83 - 50 Invocation: tVAR tPO Args tPF . + 54 Invocation: tVAR tPO Args tPF . - $défaut réduction par utilisation de la règle 50 (Invocation) + $défaut réduction par utilisation de la règle 54 (Invocation) État 84 @@ -1032,9 +1047,9 @@ Return (57) État 85 - 52 Return: tRETURN E tPV . + 56 Return: tRETURN E tPV . - $défaut réduction par utilisation de la règle 52 (Return) + $défaut réduction par utilisation de la règle 56 (Return) État 86 @@ -1073,9 +1088,9 @@ Return (57) État 89 - 51 Print: tPRINT tPO tVAR tPF tPV . + 55 Print: tPRINT tPO tVAR tPF tPV . - $défaut réduction par utilisation de la règle 51 (Print) + $défaut réduction par utilisation de la règle 55 (Print) État 90 @@ -1144,55 +1159,7 @@ Return (57) 27 | E . tMUL E 28 | E . tSUB E 29 | E . tDIV E - 41 Cond: E tEGAL E . - - tADD décalage et aller à l'état 67 - tSUB décalage et aller à l'état 68 - tMUL décalage et aller à l'état 69 - tDIV décalage et aller à l'état 70 - - $défaut réduction par utilisation de la règle 41 (Cond) - - -État 96 - - 26 E: E . tADD E - 27 | E . tMUL E - 28 | E . tSUB E - 29 | E . tDIV E - 42 Cond: E tDIFF E . - - tADD décalage et aller à l'état 67 - tSUB décalage et aller à l'état 68 - tMUL décalage et aller à l'état 69 - tDIV décalage et aller à l'état 70 - - $défaut réduction par utilisation de la règle 42 (Cond) - - -État 97 - - 26 E: E . tADD E - 27 | E . tMUL E - 28 | E . tSUB E - 29 | E . tDIV E - 43 Cond: E tLT E . - - tADD décalage et aller à l'état 67 - tSUB décalage et aller à l'état 68 - tMUL décalage et aller à l'état 69 - tDIV décalage et aller à l'état 70 - - $défaut réduction par utilisation de la règle 43 (Cond) - - -État 98 - - 26 E: E . tADD E - 27 | E . tMUL E - 28 | E . tSUB E - 29 | E . tDIV E - 44 Cond: E tGT E . + 44 Cond: E tEGAL E . tADD décalage et aller à l'état 67 tSUB décalage et aller à l'état 68 @@ -1202,29 +1169,13 @@ Return (57) $défaut réduction par utilisation de la règle 44 (Cond) -État 99 +État 96 26 E: E . tADD E 27 | E . tMUL E 28 | E . tSUB E 29 | E . tDIV E - 46 Cond: E tGTE E . - - tADD décalage et aller à l'état 67 - tSUB décalage et aller à l'état 68 - tMUL décalage et aller à l'état 69 - tDIV décalage et aller à l'état 70 - - $défaut réduction par utilisation de la règle 46 (Cond) - - -État 100 - - 26 E: E . tADD E - 27 | E . tMUL E - 28 | E . tSUB E - 29 | E . tDIV E - 45 Cond: E tLTE E . + 45 Cond: E tDIFF E . tADD décalage et aller à l'état 67 tSUB décalage et aller à l'état 68 @@ -1234,47 +1185,94 @@ Return (57) $défaut réduction par utilisation de la règle 45 (Cond) -État 101 +État 97 - 48 Cond: E tOR Cond . + 26 E: E . tADD E + 27 | E . tMUL E + 28 | E . tSUB E + 29 | E . tDIV E + 46 Cond: E tLT E . - $défaut réduction par utilisation de la règle 48 (Cond) + tADD décalage et aller à l'état 67 + tSUB décalage et aller à l'état 68 + tMUL décalage et aller à l'état 69 + tDIV décalage et aller à l'état 70 + + $défaut réduction par utilisation de la règle 46 (Cond) -État 102 +État 98 - 47 Cond: E tAND Cond . + 26 E: E . tADD E + 27 | E . tMUL E + 28 | E . tSUB E + 29 | E . tDIV E + 47 Cond: E tGT E . + + tADD décalage et aller à l'état 67 + tSUB décalage et aller à l'état 68 + tMUL décalage et aller à l'état 69 + tDIV décalage et aller à l'état 70 $défaut réduction par utilisation de la règle 47 (Cond) +État 99 + + 26 E: E . tADD E + 27 | E . tMUL E + 28 | E . tSUB E + 29 | E . tDIV E + 49 Cond: E tGTE E . + + tADD décalage et aller à l'état 67 + tSUB décalage et aller à l'état 68 + tMUL décalage et aller à l'état 69 + tDIV décalage et aller à l'état 70 + + $défaut réduction par utilisation de la règle 49 (Cond) + + +État 100 + + 26 E: E . tADD E + 27 | E . tMUL E + 28 | E . tSUB E + 29 | E . tDIV E + 48 Cond: E tLTE E . + + tADD décalage et aller à l'état 67 + tSUB décalage et aller à l'état 68 + tMUL décalage et aller à l'état 69 + tDIV décalage et aller à l'état 70 + + $défaut réduction par utilisation de la règle 48 (Cond) + + +État 101 + + 51 Cond: E tOR Cond . + + $défaut réduction par utilisation de la règle 51 (Cond) + + +État 102 + + 50 Cond: E tAND Cond . + + $défaut réduction par utilisation de la règle 50 (Cond) + + État 103 - 37 If: tIF tPO Cond tPF tAO . Instructions tAF Else + 39 If: tIF tPO Cond tPF $@1 . tAO Instructions tAF $@2 Else - tINT décalage et aller à l'état 16 - tPRINT décalage et aller à l'état 17 - tIF décalage et aller à l'état 18 - tWHILE décalage et aller à l'état 19 - tCONST décalage et aller à l'état 20 - tVAR décalage et aller à l'état 21 - - $défaut réduction par utilisation de la règle 9 (Instructions) - - Instructions aller à l'état 107 - Instruction aller à l'état 23 - Decl aller à l'état 24 - Type aller à l'état 25 - Aff aller à l'état 26 - If aller à l'état 27 - While aller à l'état 28 - Invocation aller à l'état 29 - Print aller à l'état 30 + tAO décalage et aller à l'état 107 État 104 - 40 While: tWHILE tPO Cond tPF tAO . Instructions tAF + 43 While: tWHILE tPO Cond tPF tAO . Instructions tAF tINT décalage et aller à l'état 16 tPRINT décalage et aller à l'état 17 @@ -1316,14 +1314,31 @@ Return (57) État 107 - 37 If: tIF tPO Cond tPF tAO Instructions . tAF Else + 39 If: tIF tPO Cond tPF $@1 tAO . Instructions tAF $@2 Else - tAF décalage et aller à l'état 110 + tINT décalage et aller à l'état 16 + tPRINT décalage et aller à l'état 17 + tIF décalage et aller à l'état 18 + tWHILE décalage et aller à l'état 19 + tCONST décalage et aller à l'état 20 + tVAR décalage et aller à l'état 21 + + $défaut réduction par utilisation de la règle 9 (Instructions) + + Instructions aller à l'état 110 + Instruction aller à l'état 23 + Decl aller à l'état 24 + Type aller à l'état 25 + Aff aller à l'état 26 + If aller à l'état 27 + While aller à l'état 28 + Invocation aller à l'état 29 + Print aller à l'état 30 État 108 - 40 While: tWHILE tPO Cond tPF tAO Instructions . tAF + 43 While: tWHILE tPO Cond tPF tAO Instructions . tAF tAF décalage et aller à l'état 111 @@ -1337,39 +1352,57 @@ Return (57) État 110 - 37 If: tIF tPO Cond tPF tAO Instructions tAF . Else + 39 If: tIF tPO Cond tPF $@1 tAO Instructions . tAF $@2 Else - tELSE décalage et aller à l'état 112 - - Else aller à l'état 113 + tAF décalage et aller à l'état 112 État 111 - 40 While: tWHILE tPO Cond tPF tAO Instructions tAF . + 43 While: tWHILE tPO Cond tPF tAO Instructions tAF . - $défaut réduction par utilisation de la règle 40 (While) + $défaut réduction par utilisation de la règle 43 (While) État 112 - 38 Else: tELSE . tAO Instructions tAF - 39 | tELSE . tIF tPO Cond tPF tAO Instructions tAF Else + 39 If: tIF tPO Cond tPF $@1 tAO Instructions tAF . $@2 Else - tAO décalage et aller à l'état 114 - tIF décalage et aller à l'état 115 + $défaut réduction par utilisation de la règle 38 ($@2) + + $@2 aller à l'état 113 État 113 - 37 If: tIF tPO Cond tPF tAO Instructions tAF Else . + 39 If: tIF tPO Cond tPF $@1 tAO Instructions tAF $@2 . Else - $défaut réduction par utilisation de la règle 37 (If) + tELSE décalage et aller à l'état 114 + + $défaut réduction par utilisation de la règle 41 (Else) + + Else aller à l'état 115 État 114 - 38 Else: tELSE tAO . Instructions tAF + 40 Else: tELSE . tAO Instructions tAF + 42 | tELSE . tIF tPO Cond tPF tAO Instructions tAF Else + + tAO décalage et aller à l'état 116 + tIF décalage et aller à l'état 117 + + +État 115 + + 39 If: tIF tPO Cond tPF $@1 tAO Instructions tAF $@2 Else . + + $défaut réduction par utilisation de la règle 39 (If) + + +État 116 + + 40 Else: tELSE tAO . Instructions tAF tINT décalage et aller à l'état 16 tPRINT décalage et aller à l'état 17 @@ -1380,7 +1413,7 @@ Return (57) $défaut réduction par utilisation de la règle 9 (Instructions) - Instructions aller à l'état 116 + Instructions aller à l'état 118 Instruction aller à l'état 23 Decl aller à l'état 24 Type aller à l'état 25 @@ -1391,23 +1424,23 @@ Return (57) Print aller à l'état 30 -État 115 - - 39 Else: tELSE tIF . tPO Cond tPF tAO Instructions tAF Else - - tPO décalage et aller à l'état 117 - - -État 116 - - 38 Else: tELSE tAO Instructions . tAF - - tAF décalage et aller à l'état 118 - - État 117 - 39 Else: tELSE tIF tPO . Cond tPF tAO Instructions tAF Else + 42 Else: tELSE tIF . tPO Cond tPF tAO Instructions tAF Else + + tPO décalage et aller à l'état 119 + + +État 118 + + 40 Else: tELSE tAO Instructions . tAF + + tAF décalage et aller à l'état 120 + + +État 119 + + 42 Else: tELSE tIF tPO . Cond tPF tAO Instructions tAF Else tENTIER décalage et aller à l'état 46 tSUB décalage et aller à l'état 47 @@ -1416,34 +1449,34 @@ Return (57) tNOT décalage et aller à l'état 50 E aller à l'état 51 - Cond aller à l'état 119 + Cond aller à l'état 121 Invocation aller à l'état 53 -État 118 - - 38 Else: tELSE tAO Instructions tAF . - - $défaut réduction par utilisation de la règle 38 (Else) - - -État 119 - - 39 Else: tELSE tIF tPO Cond . tPF tAO Instructions tAF Else - - tPF décalage et aller à l'état 120 - - État 120 - 39 Else: tELSE tIF tPO Cond tPF . tAO Instructions tAF Else + 40 Else: tELSE tAO Instructions tAF . - tAO décalage et aller à l'état 121 + $défaut réduction par utilisation de la règle 40 (Else) État 121 - 39 Else: tELSE tIF tPO Cond tPF tAO . Instructions tAF Else + 42 Else: tELSE tIF tPO Cond . tPF tAO Instructions tAF Else + + tPF décalage et aller à l'état 122 + + +État 122 + + 42 Else: tELSE tIF tPO Cond tPF . tAO Instructions tAF Else + + tAO décalage et aller à l'état 123 + + +État 123 + + 42 Else: tELSE tIF tPO Cond tPF tAO . Instructions tAF Else tINT décalage et aller à l'état 16 tPRINT décalage et aller à l'état 17 @@ -1454,7 +1487,7 @@ Return (57) $défaut réduction par utilisation de la règle 9 (Instructions) - Instructions aller à l'état 122 + Instructions aller à l'état 124 Instruction aller à l'état 23 Decl aller à l'état 24 Type aller à l'état 25 @@ -1465,24 +1498,26 @@ Return (57) Print aller à l'état 30 -État 122 - - 39 Else: tELSE tIF tPO Cond tPF tAO Instructions . tAF Else - - tAF décalage et aller à l'état 123 - - -État 123 - - 39 Else: tELSE tIF tPO Cond tPF tAO Instructions tAF . Else - - tELSE décalage et aller à l'état 112 - - Else aller à l'état 124 - - État 124 - 39 Else: tELSE tIF tPO Cond tPF tAO Instructions tAF Else . + 42 Else: tELSE tIF tPO Cond tPF tAO Instructions . tAF Else - $défaut réduction par utilisation de la règle 39 (Else) + tAF décalage et aller à l'état 125 + + +État 125 + + 42 Else: tELSE tIF tPO Cond tPF tAO Instructions tAF . Else + + tELSE décalage et aller à l'état 114 + + $défaut réduction par utilisation de la règle 41 (Else) + + Else aller à l'état 126 + + +État 126 + + 42 Else: tELSE tIF tPO Cond tPF tAO Instructions tAF Else . + + $défaut réduction par utilisation de la règle 42 (Else) diff --git a/analyse_syntaxique.tab.c b/analyse_syntaxique.tab.c index 7ad149a..8d2a56d 100644 --- a/analyse_syntaxique.tab.c +++ b/analyse_syntaxique.tab.c @@ -163,12 +163,14 @@ int yyparse (void); #include #include "table_symboles.h" +#include "gen_assembleur.h" enum Initialised_Variable init; enum Symbole_Type type; Table_Symboles table; +instructions_array array; -#line 172 "analyse_syntaxique.tab.c" /* yacc.c:358 */ +#line 174 "analyse_syntaxique.tab.c" /* yacc.c:358 */ #ifdef short # undef short @@ -410,16 +412,16 @@ union yyalloc /* YYFINAL -- State number of the termination state. */ #define YYFINAL 4 /* YYLAST -- Last index in YYTABLE. */ -#define YYLAST 133 +#define YYLAST 134 /* YYNTOKENS -- Number of terminals. */ #define YYNTOKENS 35 /* YYNNTS -- Number of nonterminals. */ -#define YYNNTS 23 +#define YYNNTS 25 /* YYNRULES -- Number of rules. */ -#define YYNRULES 53 +#define YYNRULES 57 /* YYNSTATES -- Number of states. */ -#define YYNSTATES 125 +#define YYNSTATES 127 /* YYTRANSLATE[YYX] -- Symbol number corresponding to YYX as returned by yylex, with out-of-bounds checking. */ @@ -468,12 +470,12 @@ static const yytype_uint8 yytranslate[] = /* YYRLINE[YYN] -- Source line where rule number YYN was defined. */ static const yytype_uint8 yyrline[] = { - 0, 68, 68, 70, 71, 73, 76, 77, 80, 82, - 83, 85, 86, 87, 88, 89, 90, 92, 94, 95, - 97, 98, 100, 101, 104, 106, 107, 108, 109, 110, - 111, 112, 113, 114, 117, 118, 120, 121, 123, 125, - 126, 128, 130, 131, 132, 133, 134, 135, 136, 137, - 138, 140, 142, 144 + 0, 75, 75, 77, 78, 80, 83, 84, 87, 89, + 90, 92, 93, 94, 95, 96, 97, 99, 101, 102, + 104, 105, 107, 108, 111, 113, 114, 115, 116, 117, + 118, 119, 120, 121, 124, 125, 127, 128, 130, 135, + 130, 141, 142, 143, 145, 147, 148, 149, 150, 151, + 152, 153, 154, 155, 156, 158, 160, 162 }; #endif @@ -489,7 +491,7 @@ static const char *const yytname[] = "tCONST", "tVAR", "tNOT", "$accept", "Main", "Params", "Param", "SuiteParams", "Body", "Instructions", "Instruction", "Decl", "SuiteDecl", "Type", "Valeur", "Aff", "E", "Args", "SuiteArgs", "If", - "Else", "While", "Cond", "Invocation", "Print", "Return", YY_NULLPTR + "$@1", "$@2", "Else", "While", "Cond", "Invocation", "Print", "Return", YY_NULLPTR }; #endif @@ -505,10 +507,10 @@ static const yytype_uint16 yytoknum[] = }; # endif -#define YYPACT_NINF -35 +#define YYPACT_NINF -34 #define yypact_value_is_default(Yystate) \ - (!!((Yystate) == (-35))) + (!!((Yystate) == (-34))) #define YYTABLE_NINF -1 @@ -519,19 +521,19 @@ static const yytype_uint16 yytoknum[] = STATE-NUM. */ static const yytype_int8 yypact[] = { - -3, -12, 31, 34, -35, 20, 25, 50, 44, -35, - 57, 20, -35, 46, -35, 44, -35, 52, 60, 65, - 56, -4, 58, 46, -35, 43, -35, -35, -35, 69, - -35, 79, 61, 14, 14, -35, 63, 16, 16, 85, - -35, 82, 91, -35, -35, 90, -35, 16, 16, 98, - 14, 45, 99, -35, 100, 101, 102, 81, 97, -35, - 16, 43, 103, 104, 8, 22, -35, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 14, 14, 108, - 109, 80, -35, -35, -35, -35, 49, 91, -35, -35, - -35, 1, 8, 106, -35, 49, 49, 49, 49, 49, - 49, -35, -35, 46, 46, 101, -35, 110, 111, -35, - 94, -35, -5, -35, 46, 112, 113, 14, -35, 105, - 115, 46, 116, 94, -35 + -18, -14, 22, 35, -34, 8, 12, 49, 45, -34, + 51, 8, -34, 47, -34, 45, -34, 52, 60, 61, + 53, -8, 55, 47, -34, 42, -34, -34, -34, 68, + -34, 70, 54, 15, 15, -34, 56, 17, 17, 73, + -34, 74, 77, -34, -34, 83, -34, 17, 17, 92, + 15, 46, 90, -34, 94, 96, 102, 91, 101, -34, + 17, 42, 99, 100, 9, 23, -34, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 15, 15, -34, + 105, 84, -34, -34, -34, -34, 50, 77, -34, -34, + -34, 5, 9, 110, -34, 50, 50, 50, 50, 50, + 50, -34, -34, 108, 47, 96, -34, 47, 109, -34, + 111, -34, -34, 95, -4, -34, 47, 113, 112, 15, + -34, 116, 117, 47, 115, 95, -34 }; /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM. @@ -544,30 +546,30 @@ static const yytype_uint8 yydefact[] = 0, 0, 0, 10, 15, 0, 11, 12, 13, 0, 14, 0, 0, 0, 0, 21, 35, 0, 0, 0, 9, 23, 19, 16, 6, 0, 25, 0, 0, 26, - 0, 0, 0, 32, 0, 37, 0, 0, 0, 8, - 0, 0, 0, 0, 31, 0, 50, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 34, 51, 24, 53, 22, 19, 17, 52, - 33, 27, 29, 28, 30, 42, 43, 44, 45, 47, - 46, 49, 48, 10, 10, 37, 18, 0, 0, 36, - 0, 41, 0, 38, 10, 0, 0, 0, 39, 0, - 0, 10, 0, 0, 40 + 0, 54, 0, 32, 0, 37, 0, 0, 0, 8, + 0, 0, 0, 0, 31, 0, 53, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 38, + 0, 0, 34, 55, 24, 57, 22, 19, 17, 56, + 33, 27, 29, 28, 30, 45, 46, 47, 48, 50, + 49, 52, 51, 0, 10, 37, 18, 10, 0, 36, + 0, 44, 39, 42, 0, 40, 10, 0, 0, 0, + 41, 0, 0, 10, 0, 42, 43 }; /* YYPGOTO[NTERM-NUM]. */ static const yytype_int8 yypgoto[] = { - -35, -35, -35, 118, 117, -35, -22, -35, -35, 40, - -35, 70, -35, -34, -35, 28, -35, 7, -35, -32, - -13, -35, -35 + -34, -34, -34, 118, 119, -34, -21, -34, -34, 33, + -34, 69, -34, -33, -34, 26, -34, -34, -34, 7, + -34, -31, -13, -34, -34 }; /* YYDEFGOTO[NTERM-NUM]. */ static const yytype_int8 yydefgoto[] = { -1, 2, 7, 8, 12, 14, 22, 23, 24, 62, - 25, 42, 26, 51, 56, 82, 27, 113, 28, 52, - 53, 30, 39 + 25, 42, 26, 51, 56, 82, 27, 103, 113, 115, + 28, 52, 53, 30, 39 }; /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If @@ -575,38 +577,38 @@ static const yytype_int8 yydefgoto[] = number is the opposite. If YYTABLE_NINF, syntax error. */ static const yytype_uint8 yytable[] = { - 29, 40, 54, 57, 58, 36, 114, 68, 69, 70, - 29, 3, 37, 64, 65, 69, 70, 46, 66, 46, - 47, 1, 47, 48, 115, 48, 86, 67, 68, 69, - 70, 4, 90, 91, 92, 93, 94, 95, 96, 97, - 98, 99, 100, 5, 6, 101, 102, 49, 50, 49, - 67, 68, 69, 70, 67, 68, 69, 70, 9, 11, - 10, 32, 71, 72, 73, 74, 75, 76, 13, 33, - 16, 17, 77, 78, 34, 18, 41, 19, 20, 21, - 35, 107, 108, 43, 38, 119, 67, 68, 69, 70, - 29, 29, 116, 44, 45, 84, 55, 59, 60, 122, - 63, 29, 67, 68, 69, 70, 61, 36, 29, 79, - 80, 85, 83, 105, 70, 120, 81, 88, 89, 103, - 104, 117, 110, 111, 112, 118, 121, 106, 123, 15, - 124, 87, 31, 109 + 29, 36, 40, 54, 57, 58, 1, 116, 37, 3, + 29, 68, 69, 70, 64, 65, 69, 70, 46, 66, + 46, 47, 4, 47, 48, 117, 48, 86, 67, 68, + 69, 70, 6, 90, 91, 92, 93, 94, 95, 96, + 97, 98, 99, 100, 5, 9, 101, 102, 49, 50, + 49, 67, 68, 69, 70, 67, 68, 69, 70, 10, + 11, 32, 13, 71, 72, 73, 74, 75, 76, 33, + 34, 16, 17, 77, 78, 41, 18, 35, 19, 20, + 21, 38, 43, 108, 44, 59, 110, 45, 121, 55, + 60, 29, 61, 63, 29, 118, 67, 68, 69, 70, + 79, 36, 124, 29, 80, 84, 67, 68, 69, 70, + 29, 81, 83, 88, 89, 85, 104, 105, 70, 107, + 106, 111, 119, 112, 120, 114, 122, 125, 123, 15, + 87, 109, 126, 0, 31 }; -static const yytype_uint8 yycheck[] = +static const yytype_int8 yycheck[] = { - 13, 23, 34, 37, 38, 9, 11, 6, 7, 8, - 23, 23, 16, 47, 48, 7, 8, 3, 50, 3, - 6, 24, 6, 9, 29, 9, 60, 5, 6, 7, - 8, 0, 10, 67, 68, 69, 70, 71, 72, 73, - 74, 75, 76, 9, 24, 77, 78, 33, 34, 33, - 5, 6, 7, 8, 5, 6, 7, 8, 33, 15, - 10, 9, 17, 18, 19, 20, 21, 22, 11, 9, - 24, 25, 27, 28, 9, 29, 33, 31, 32, 33, - 24, 103, 104, 14, 26, 117, 5, 6, 7, 8, - 103, 104, 114, 14, 33, 14, 33, 12, 16, 121, - 10, 114, 5, 6, 7, 8, 15, 9, 121, 10, - 10, 14, 10, 33, 8, 10, 15, 14, 14, 11, - 11, 9, 12, 12, 30, 12, 11, 87, 12, 11, - 123, 61, 15, 105 + 13, 9, 23, 34, 37, 38, 24, 11, 16, 23, + 23, 6, 7, 8, 47, 48, 7, 8, 3, 50, + 3, 6, 0, 6, 9, 29, 9, 60, 5, 6, + 7, 8, 24, 10, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 9, 33, 77, 78, 33, 34, + 33, 5, 6, 7, 8, 5, 6, 7, 8, 10, + 15, 9, 11, 17, 18, 19, 20, 21, 22, 9, + 9, 24, 25, 27, 28, 33, 29, 24, 31, 32, + 33, 26, 14, 104, 14, 12, 107, 33, 119, 33, + 16, 104, 15, 10, 107, 116, 5, 6, 7, 8, + 10, 9, 123, 116, 10, 14, 5, 6, 7, 8, + 123, 15, 10, 14, 14, 14, 11, 33, 8, 11, + 87, 12, 9, 12, 12, 30, 10, 12, 11, 11, + 61, 105, 125, -1, 15 }; /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing @@ -615,17 +617,17 @@ static const yytype_uint8 yystos[] = { 0, 24, 36, 23, 0, 9, 24, 37, 38, 33, 10, 15, 39, 11, 40, 38, 24, 25, 29, 31, - 32, 33, 41, 42, 43, 45, 47, 51, 53, 55, - 56, 39, 9, 9, 9, 24, 9, 16, 26, 57, + 32, 33, 41, 42, 43, 45, 47, 51, 55, 57, + 58, 39, 9, 9, 9, 24, 9, 16, 26, 59, 41, 33, 46, 14, 14, 33, 3, 6, 9, 33, - 34, 48, 54, 55, 54, 33, 49, 48, 48, 12, - 16, 15, 44, 10, 48, 48, 54, 5, 6, 7, + 34, 48, 56, 57, 56, 33, 49, 48, 48, 12, + 16, 15, 44, 10, 48, 48, 56, 5, 6, 7, 8, 17, 18, 19, 20, 21, 22, 27, 28, 10, 10, 15, 50, 10, 14, 14, 48, 46, 14, 14, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 54, 54, 11, 11, 33, 44, 41, 41, 50, - 12, 12, 30, 52, 11, 29, 41, 9, 12, 54, - 10, 11, 41, 12, 52 + 48, 56, 56, 52, 11, 33, 44, 11, 41, 50, + 41, 12, 12, 53, 30, 54, 11, 29, 41, 9, + 12, 56, 10, 11, 41, 12, 54 }; /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ @@ -634,9 +636,9 @@ static const yytype_uint8 yyr1[] = 0, 35, 36, 37, 37, 38, 39, 39, 40, 41, 41, 42, 42, 42, 42, 42, 42, 43, 44, 44, 45, 45, 46, 46, 47, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 49, 49, 50, 50, 51, 52, - 52, 53, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 55, 56, 57 + 48, 48, 48, 48, 49, 49, 50, 50, 52, 53, + 51, 54, 54, 54, 55, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 57, 58, 59 }; /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN. */ @@ -645,9 +647,9 @@ static const yytype_uint8 yyr2[] = 0, 2, 6, 0, 2, 2, 4, 0, 4, 2, 0, 1, 1, 1, 1, 1, 2, 4, 3, 0, 1, 2, 3, 1, 4, 1, 1, 3, 3, 3, - 3, 2, 1, 3, 2, 0, 3, 0, 8, 4, - 9, 7, 3, 3, 3, 3, 3, 3, 3, 3, - 2, 4, 5, 3 + 3, 2, 1, 3, 2, 0, 3, 0, 0, 0, + 10, 4, 0, 9, 7, 3, 3, 3, 3, 3, + 3, 3, 3, 2, 1, 4, 5, 3 }; @@ -1324,205 +1326,229 @@ yyreduce: switch (yyn) { case 2: -#line 68 "analyse_syntaxique.y" /* yacc.c:1646 */ +#line 75 "analyse_syntaxique.y" /* yacc.c:1646 */ {} -#line 1330 "analyse_syntaxique.tab.c" /* yacc.c:1646 */ +#line 1332 "analyse_syntaxique.tab.c" /* yacc.c:1646 */ break; case 3: -#line 70 "analyse_syntaxique.y" /* yacc.c:1646 */ +#line 77 "analyse_syntaxique.y" /* yacc.c:1646 */ {printf("Sans params\n");} -#line 1336 "analyse_syntaxique.tab.c" /* yacc.c:1646 */ +#line 1338 "analyse_syntaxique.tab.c" /* yacc.c:1646 */ break; case 5: -#line 73 "analyse_syntaxique.y" /* yacc.c:1646 */ +#line 80 "analyse_syntaxique.y" /* yacc.c:1646 */ {printf("Parametre : %s\n", (yyvsp[0].id));} -#line 1342 "analyse_syntaxique.tab.c" /* yacc.c:1646 */ +#line 1344 "analyse_syntaxique.tab.c" /* yacc.c:1646 */ break; case 8: -#line 80 "analyse_syntaxique.y" /* yacc.c:1646 */ +#line 87 "analyse_syntaxique.y" /* yacc.c:1646 */ {printf("Dans body\n");} -#line 1348 "analyse_syntaxique.tab.c" /* yacc.c:1646 */ +#line 1350 "analyse_syntaxique.tab.c" /* yacc.c:1646 */ break; case 20: -#line 97 "analyse_syntaxique.y" /* yacc.c:1646 */ +#line 104 "analyse_syntaxique.y" /* yacc.c:1646 */ {type = TYPE_INT;} -#line 1354 "analyse_syntaxique.tab.c" /* yacc.c:1646 */ +#line 1356 "analyse_syntaxique.tab.c" /* yacc.c:1646 */ break; case 21: -#line 98 "analyse_syntaxique.y" /* yacc.c:1646 */ +#line 105 "analyse_syntaxique.y" /* yacc.c:1646 */ {type = TYPE_CONST_INT;} -#line 1360 "analyse_syntaxique.tab.c" /* yacc.c:1646 */ +#line 1362 "analyse_syntaxique.tab.c" /* yacc.c:1646 */ break; case 22: -#line 100 "analyse_syntaxique.y" /* yacc.c:1646 */ - {add_symbole_top(&table, (yyvsp[-2].id), type, INITIALISED, table.depth);} -#line 1366 "analyse_syntaxique.tab.c" /* yacc.c:1646 */ +#line 107 "analyse_syntaxique.y" /* yacc.c:1646 */ + {add_symbole_top(&table, (yyvsp[-2].id), type, INITIALISED, table.depth); free_temp(&table);} +#line 1368 "analyse_syntaxique.tab.c" /* yacc.c:1646 */ break; case 23: -#line 101 "analyse_syntaxique.y" /* yacc.c:1646 */ +#line 108 "analyse_syntaxique.y" /* yacc.c:1646 */ {add_symbole_top(&table, (yyvsp[0].id), type, NOT_INITIALISED, table.depth);} -#line 1372 "analyse_syntaxique.tab.c" /* yacc.c:1646 */ +#line 1374 "analyse_syntaxique.tab.c" /* yacc.c:1646 */ break; case 24: -#line 104 "analyse_syntaxique.y" /* yacc.c:1646 */ - {printf("Affectation : %s\n", (yyvsp[-3].id));} -#line 1378 "analyse_syntaxique.tab.c" /* yacc.c:1646 */ +#line 111 "analyse_syntaxique.y" /* yacc.c:1646 */ + {printf("Affectation : %s\n", (yyvsp[-3].id)); free_temp(&table);} +#line 1380 "analyse_syntaxique.tab.c" /* yacc.c:1646 */ break; case 25: -#line 106 "analyse_syntaxique.y" /* yacc.c:1646 */ - {printf("int %d\n", (yyvsp[0].nombre));} -#line 1384 "analyse_syntaxique.tab.c" /* yacc.c:1646 */ +#line 113 "analyse_syntaxique.y" /* yacc.c:1646 */ + {int vt = gen_entier(&table, &array, (yyvsp[0].nombre)); (yyval.nombre) = vt;} +#line 1386 "analyse_syntaxique.tab.c" /* yacc.c:1646 */ break; case 26: -#line 107 "analyse_syntaxique.y" /* yacc.c:1646 */ - {printf("var %s\n", (yyvsp[0].id));} -#line 1390 "analyse_syntaxique.tab.c" /* yacc.c:1646 */ +#line 114 "analyse_syntaxique.y" /* yacc.c:1646 */ + {int vt = gen_var(&table, &array, (yyvsp[0].id)); (yyval.nombre) = vt;} +#line 1392 "analyse_syntaxique.tab.c" /* yacc.c:1646 */ break; case 27: -#line 108 "analyse_syntaxique.y" /* yacc.c:1646 */ - {printf("Addition\n");} -#line 1396 "analyse_syntaxique.tab.c" /* yacc.c:1646 */ +#line 115 "analyse_syntaxique.y" /* yacc.c:1646 */ + {gen_arithmetique(&array, ADD, (yyvsp[-2].nombre), (yyvsp[0].nombre)); free_temp(&table); (yyval.nombre) = (yyvsp[-2].nombre);} +#line 1398 "analyse_syntaxique.tab.c" /* yacc.c:1646 */ break; case 28: -#line 109 "analyse_syntaxique.y" /* yacc.c:1646 */ - {printf("Multiplication\n");} -#line 1402 "analyse_syntaxique.tab.c" /* yacc.c:1646 */ +#line 116 "analyse_syntaxique.y" /* yacc.c:1646 */ + {gen_arithmetique(&array, MUL, (yyvsp[-2].nombre), (yyvsp[0].nombre)); free_temp(&table); (yyval.nombre) = (yyvsp[-2].nombre);} +#line 1404 "analyse_syntaxique.tab.c" /* yacc.c:1646 */ break; case 29: -#line 110 "analyse_syntaxique.y" /* yacc.c:1646 */ - {printf("Soustraction\n");} -#line 1408 "analyse_syntaxique.tab.c" /* yacc.c:1646 */ +#line 117 "analyse_syntaxique.y" /* yacc.c:1646 */ + {gen_arithmetique(&array, SOU, (yyvsp[-2].nombre), (yyvsp[0].nombre)); free_temp(&table); (yyval.nombre) = (yyvsp[-2].nombre);} +#line 1410 "analyse_syntaxique.tab.c" /* yacc.c:1646 */ break; case 30: -#line 111 "analyse_syntaxique.y" /* yacc.c:1646 */ - {printf("Division\n");} -#line 1414 "analyse_syntaxique.tab.c" /* yacc.c:1646 */ +#line 118 "analyse_syntaxique.y" /* yacc.c:1646 */ + {gen_arithmetique(&array, DIV, (yyvsp[-2].nombre), (yyvsp[0].nombre)); free_temp(&table); (yyval.nombre) = (yyvsp[-2].nombre);} +#line 1416 "analyse_syntaxique.tab.c" /* yacc.c:1646 */ break; case 31: -#line 112 "analyse_syntaxique.y" /* yacc.c:1646 */ - {printf("Soustraction\n");} -#line 1420 "analyse_syntaxique.tab.c" /* yacc.c:1646 */ +#line 119 "analyse_syntaxique.y" /* yacc.c:1646 */ + {printf("Variable negative\n");} +#line 1422 "analyse_syntaxique.tab.c" /* yacc.c:1646 */ + break; + + case 32: +#line 120 "analyse_syntaxique.y" /* yacc.c:1646 */ + {(yyval.nombre) = 1234;} +#line 1428 "analyse_syntaxique.tab.c" /* yacc.c:1646 */ break; case 33: -#line 114 "analyse_syntaxique.y" /* yacc.c:1646 */ - {printf("Parenthèse\n");} -#line 1426 "analyse_syntaxique.tab.c" /* yacc.c:1646 */ +#line 121 "analyse_syntaxique.y" /* yacc.c:1646 */ + {printf("Parenthèse\n"); (yyval.nombre) = (yyvsp[-1].nombre); } +#line 1434 "analyse_syntaxique.tab.c" /* yacc.c:1646 */ break; case 38: -#line 123 "analyse_syntaxique.y" /* yacc.c:1646 */ - {printf("Dans if\n");} -#line 1432 "analyse_syntaxique.tab.c" /* yacc.c:1646 */ +#line 130 "analyse_syntaxique.y" /* yacc.c:1646 */ + { + gen_jmpf(&table, &array, (yyvsp[-1].nombre)); + (yyvsp[-3].nombre) = array.index; +} +#line 1443 "analyse_syntaxique.tab.c" /* yacc.c:1646 */ break; case 39: -#line 125 "analyse_syntaxique.y" /* yacc.c:1646 */ - {printf("else\n");} -#line 1438 "analyse_syntaxique.tab.c" /* yacc.c:1646 */ +#line 135 "analyse_syntaxique.y" /* yacc.c:1646 */ + { + int adr_jmp = array.index; + update_jump(&array, (yyvsp[-7].nombre), adr_jmp); +} +#line 1452 "analyse_syntaxique.tab.c" /* yacc.c:1646 */ break; case 40: -#line 126 "analyse_syntaxique.y" /* yacc.c:1646 */ - {printf("elsif\n");} -#line 1444 "analyse_syntaxique.tab.c" /* yacc.c:1646 */ +#line 139 "analyse_syntaxique.y" /* yacc.c:1646 */ + {printf("Dans if\n");} +#line 1458 "analyse_syntaxique.tab.c" /* yacc.c:1646 */ break; case 41: -#line 128 "analyse_syntaxique.y" /* yacc.c:1646 */ - {printf("Dans while\n");} -#line 1450 "analyse_syntaxique.tab.c" /* yacc.c:1646 */ - break; - - case 42: -#line 130 "analyse_syntaxique.y" /* yacc.c:1646 */ - {printf("Cond ==\n");} -#line 1456 "analyse_syntaxique.tab.c" /* yacc.c:1646 */ +#line 141 "analyse_syntaxique.y" /* yacc.c:1646 */ + {printf("else\n");} +#line 1464 "analyse_syntaxique.tab.c" /* yacc.c:1646 */ break; case 43: -#line 131 "analyse_syntaxique.y" /* yacc.c:1646 */ - {printf("Cond !=\n");} -#line 1462 "analyse_syntaxique.tab.c" /* yacc.c:1646 */ +#line 143 "analyse_syntaxique.y" /* yacc.c:1646 */ + {printf("elsif\n");} +#line 1470 "analyse_syntaxique.tab.c" /* yacc.c:1646 */ break; case 44: -#line 132 "analyse_syntaxique.y" /* yacc.c:1646 */ - {printf("Cond <\n");} -#line 1468 "analyse_syntaxique.tab.c" /* yacc.c:1646 */ +#line 145 "analyse_syntaxique.y" /* yacc.c:1646 */ + {printf("Dans while\n");} +#line 1476 "analyse_syntaxique.tab.c" /* yacc.c:1646 */ break; case 45: -#line 133 "analyse_syntaxique.y" /* yacc.c:1646 */ - {printf("Cond >\n");} -#line 1474 "analyse_syntaxique.tab.c" /* yacc.c:1646 */ +#line 147 "analyse_syntaxique.y" /* yacc.c:1646 */ + {printf("Cond ==\n");} +#line 1482 "analyse_syntaxique.tab.c" /* yacc.c:1646 */ break; case 46: -#line 134 "analyse_syntaxique.y" /* yacc.c:1646 */ - {printf("Cond <=\n");} -#line 1480 "analyse_syntaxique.tab.c" /* yacc.c:1646 */ +#line 148 "analyse_syntaxique.y" /* yacc.c:1646 */ + {printf("Cond !=\n");} +#line 1488 "analyse_syntaxique.tab.c" /* yacc.c:1646 */ break; case 47: -#line 135 "analyse_syntaxique.y" /* yacc.c:1646 */ - {printf("Cond >=\n");} -#line 1486 "analyse_syntaxique.tab.c" /* yacc.c:1646 */ +#line 149 "analyse_syntaxique.y" /* yacc.c:1646 */ + {printf("Cond <\n");} +#line 1494 "analyse_syntaxique.tab.c" /* yacc.c:1646 */ break; case 48: -#line 136 "analyse_syntaxique.y" /* yacc.c:1646 */ - {printf("Cond &&\n");} -#line 1492 "analyse_syntaxique.tab.c" /* yacc.c:1646 */ +#line 150 "analyse_syntaxique.y" /* yacc.c:1646 */ + {printf("Cond >\n");} +#line 1500 "analyse_syntaxique.tab.c" /* yacc.c:1646 */ break; case 49: -#line 137 "analyse_syntaxique.y" /* yacc.c:1646 */ - {printf("Cond ||\n");} -#line 1498 "analyse_syntaxique.tab.c" /* yacc.c:1646 */ +#line 151 "analyse_syntaxique.y" /* yacc.c:1646 */ + {printf("Cond <=\n");} +#line 1506 "analyse_syntaxique.tab.c" /* yacc.c:1646 */ break; case 50: -#line 138 "analyse_syntaxique.y" /* yacc.c:1646 */ - {printf("Cond !\n");} -#line 1504 "analyse_syntaxique.tab.c" /* yacc.c:1646 */ +#line 152 "analyse_syntaxique.y" /* yacc.c:1646 */ + {printf("Cond >=\n");} +#line 1512 "analyse_syntaxique.tab.c" /* yacc.c:1646 */ break; case 51: -#line 140 "analyse_syntaxique.y" /* yacc.c:1646 */ - {printf("Dans invocation\n");} -#line 1510 "analyse_syntaxique.tab.c" /* yacc.c:1646 */ +#line 153 "analyse_syntaxique.y" /* yacc.c:1646 */ + {printf("Cond &&\n");} +#line 1518 "analyse_syntaxique.tab.c" /* yacc.c:1646 */ break; case 52: -#line 142 "analyse_syntaxique.y" /* yacc.c:1646 */ - {printf("printf de %s\n", (yyvsp[-2].id));} -#line 1516 "analyse_syntaxique.tab.c" /* yacc.c:1646 */ +#line 154 "analyse_syntaxique.y" /* yacc.c:1646 */ + {printf("Cond ||\n");} +#line 1524 "analyse_syntaxique.tab.c" /* yacc.c:1646 */ break; case 53: -#line 144 "analyse_syntaxique.y" /* yacc.c:1646 */ - {printf("return\n");} -#line 1522 "analyse_syntaxique.tab.c" /* yacc.c:1646 */ +#line 155 "analyse_syntaxique.y" /* yacc.c:1646 */ + {printf("Cond !\n");} +#line 1530 "analyse_syntaxique.tab.c" /* yacc.c:1646 */ + break; + + case 55: +#line 158 "analyse_syntaxique.y" /* yacc.c:1646 */ + {printf("Dans invocation\n");} +#line 1536 "analyse_syntaxique.tab.c" /* yacc.c:1646 */ + break; + + case 56: +#line 160 "analyse_syntaxique.y" /* yacc.c:1646 */ + {printf("printf de %s\n", (yyvsp[-2].id));} +#line 1542 "analyse_syntaxique.tab.c" /* yacc.c:1646 */ + break; + + case 57: +#line 162 "analyse_syntaxique.y" /* yacc.c:1646 */ + {(yyval.nombre)= gen_return(&table, &array, (yyvsp[-1].nombre));} +#line 1548 "analyse_syntaxique.tab.c" /* yacc.c:1646 */ break; -#line 1526 "analyse_syntaxique.tab.c" /* yacc.c:1646 */ +#line 1552 "analyse_syntaxique.tab.c" /* yacc.c:1646 */ default: break; } /* User semantic actions sometimes alter yychar, and that requires @@ -1750,14 +1776,16 @@ yyreturn: #endif return yyresult; } -#line 146 "analyse_syntaxique.y" /* yacc.c:1906 */ +#line 164 "analyse_syntaxique.y" /* yacc.c:1906 */ #include void main(void){ + //TODO: rajouter gestion des erreurs initialise_table(&table); + initialise_asm(&array); yyparse(); print_table(&table); - remove_symboles(&table, 0); - print_table(&table); + //remove_symboles(&table, 0); + //print_table(&table); } diff --git a/analyse_syntaxique.y b/analyse_syntaxique.y index bc35442..ce89f36 100644 --- a/analyse_syntaxique.y +++ b/analyse_syntaxique.y @@ -6,16 +6,23 @@ char id[30]; %{ #include #include "table_symboles.h" +#include "gen_assembleur.h" enum Initialised_Variable init; enum Symbole_Type type; Table_Symboles table; +instructions_array array; %} %token tENTIER %token tENTIEREXP +%type E +%type Return +%type Cond + + %token tADD %token tSUB %token tMUL @@ -43,7 +50,7 @@ Table_Symboles table; %token tRETURN %token tOR %token tAND -%token tIF +%token tIF %token tELSE %token tWHILE %token tCONST @@ -97,21 +104,21 @@ SuiteDecl: ; Type : tINT {type = TYPE_INT;} ; Type : tCONST tINT {type = TYPE_CONST_INT;} ; -Valeur : tVAR tAFFECTATION E {add_symbole_top(&table, $1, type, INITIALISED, table.depth);}; +Valeur : tVAR tAFFECTATION E {add_symbole_top(&table, $1, type, INITIALISED, table.depth); free_temp(&table);}; Valeur : tVAR {add_symbole_top(&table, $1, type, NOT_INITIALISED, table.depth);}; -Aff : tVAR tAFFECTATION E tPV {printf("Affectation : %s\n", $1);}; +Aff : tVAR tAFFECTATION E tPV {printf("Affectation : %s\n", $1); free_temp(&table);}; -E : tENTIER {printf("int %d\n", $1);}; -E : tVAR {printf("var %s\n", $1);}; -E : E tADD E {printf("Addition\n");} ; -E : E tMUL E {printf("Multiplication\n");} ; -E : E tSUB E {printf("Soustraction\n");} ; -E : E tDIV E {printf("Division\n");} ; -E : tSUB E {printf("Soustraction\n");} ; -E : Invocation ; -E : tPO E tPF {printf("Parenthèse\n");} ; +E : tENTIER {int vt = gen_entier(&table, &array, $1); $$ = vt;}; +E : tVAR {int vt = gen_var(&table, &array, $1); $$ = vt;}; +E : E tADD E {gen_arithmetique(&array, ADD, $1, $3); free_temp(&table); $$ = $1;} ; +E : E tMUL E {gen_arithmetique(&array, MUL, $1, $3); free_temp(&table); $$ = $1;} ; +E : E tSUB E {gen_arithmetique(&array, SOU, $1, $3); free_temp(&table); $$ = $1;} ; +E : E tDIV E {gen_arithmetique(&array, DIV, $1, $3); free_temp(&table); $$ = $1;} ; +E : tSUB E {printf("Variable negative\n");} ; +E : Invocation {$$ = 1234;}; +E : tPO E tPF {printf("Parenthèse\n"); $$ = $2; } ; Args : tVAR SuiteArgs ; @@ -120,9 +127,19 @@ Args : ; SuiteArgs : tVIRGULE tVAR SuiteArgs ; SuiteArgs : ; -If : tIF tPO Cond tPF tAO Instructions tAF Else {printf("Dans if\n");}; +If : tIF tPO Cond tPF { + gen_jmpf(&table, &array, $3); + $1 = array.index; +} +tAO Instructions tAF +{ + int adr_jmp = array.index; + update_jump(&array, $1, adr_jmp); +} +Else {printf("Dans if\n");}; Else : tELSE tAO Instructions tAF {printf("else\n");} ; +Else : ; Else : tELSE tIF tPO Cond tPF tAO Instructions tAF Else {printf("elsif\n");} ; While : tWHILE tPO Cond tPF tAO Instructions tAF {printf("Dans while\n");}; @@ -136,21 +153,23 @@ Cond : E tGTE E{printf("Cond >=\n");} ; Cond : E tAND Cond {printf("Cond &&\n");} ; Cond : E tOR Cond {printf("Cond ||\n");} ; Cond : tNOT Cond {printf("Cond !\n");} ; +Cond : E; Invocation : tVAR tPO Args tPF {printf("Dans invocation\n");}; Print : tPRINT tPO tVAR tPF tPV {printf("printf de %s\n", $3);}; -Return : tRETURN E tPV {printf("return\n");}; +Return : tRETURN E tPV {$$= gen_return(&table, &array, $2);}; %% #include void main(void){ //TODO: rajouter gestion des erreurs initialise_table(&table); + initialise_asm(&array); yyparse(); print_table(&table); - remove_symboles(&table, 0); - print_table(&table); + //remove_symboles(&table, 0); + //print_table(&table); } diff --git a/gen_assembleur.c b/gen_assembleur.c index e69de29..fb64c2c 100644 --- a/gen_assembleur.c +++ b/gen_assembleur.c @@ -0,0 +1,139 @@ +#include "gen_assembleur.h" + + +int new_temp(Table_Symboles * table){ + int ret_addr ; + if(add_symbole_bottom(table) == -1) { + return -1; + } + ret_addr = table->indexAvailableBottom +1; + return ret_addr; +} + +void gen_arithmetique(instructions_array * array, enum operation op, int arg1, int arg2){ + instruction instru; + switch(op){ + case ADD: + instru.operation = ADD; + instru.reg1 = arg1; + instru.reg2 = arg1; + instru.reg3 = arg2; + printf("%d ADD %d %d %d\n", array->index, arg1, arg1, arg2); + break; + case DIV: + instru.operation = DIV; + instru.reg1 = arg1; + instru.reg2 = arg1; + instru.reg3 = arg2; + printf("%d DIV %d %d %d\n", array->index, arg1, arg1, arg2); + break; + case SOU: + instru.operation = SOU; + instru.reg1 = arg1; + instru.reg2 = arg1; + instru.reg3 = arg2; + printf("%d SOU %d %d %d\n", array->index, arg1, arg1, arg2); + break; + case MUL: + instru.operation = MUL; + instru.reg1 = arg1; + instru.reg2 = arg1; + instru.reg3 = arg2; + printf("%d MUL %d %d %d\n", array->index, arg1, arg1, arg2); + break; + default: + break; + } + if (array->index < INSTRUCTION_TABLE_SIZE){ + array->array[array->index] = instru; + array->index++; + } + +} + +int gen_var(Table_Symboles * table, instructions_array * array, char * varName){ + int vt = new_temp(table); + int varAddr = variable_exists(table, varName); + + //vérifier que non null + instruction instru; + instru.operation = CPY; + instru.reg1 = vt; + instru.reg2 = varAddr; + + printf("%d CPY %d %d\n", array->index, vt, varAddr); + + if (array->index < INSTRUCTION_TABLE_SIZE){ + array->array[array->index] = instru; + array->index++; + } + + return vt; + +} + +int gen_entier(Table_Symboles * table, instructions_array * array, int entier){ + int vt = new_temp(table); + + //vérifier que non null + instruction instru; + instru.operation = AFC; + instru.reg1 = vt; + instru.reg2 = entier; + + printf("%d AFC %d %d\n", array->index, vt, entier); + + if (array->index < INSTRUCTION_TABLE_SIZE){ + array->array[array->index] = instru; + array->index++; + } + + return vt; +} + +int gen_return(Table_Symboles * table, instructions_array * array, int adr){ + + //vérifier que non null + instruction instru; + instru.operation = RET; + instru.reg1 = adr; + + printf("%d RET %d\n", array->index, adr); + + if (array->index < INSTRUCTION_TABLE_SIZE){ + array->array[array->index] = instru; + array->index++; + } + + free_temp(table); + + return adr; +} + +int gen_jmpf(Table_Symboles * table, instructions_array * array, int cond){ + //vérifier que non null + instruction instru; + instru.operation = JMPF; + instru.reg1 = cond; + instru.reg2 = -1; + + printf("%d JMPF %d %d\n", array->index, cond, -1); + + if (array->index < INSTRUCTION_TABLE_SIZE){ + array->array[array->index] = instru; + array->index++; + } + + free_temp(table); + + return cond; +} + +void update_jump(instructions_array * array, int if_value, int adr_jmp){ + array->array[if_value].reg2 = adr_jmp; + printf("%d JMPF %d %d\n", array->index, array->array[if_value].reg1, array->array[if_value].reg2); +} + +void initialise_asm(instructions_array * array){ + array->index = 0; +} \ No newline at end of file diff --git a/gen_assembleur.h b/gen_assembleur.h index 3b0f268..83b642d 100644 --- a/gen_assembleur.h +++ b/gen_assembleur.h @@ -2,20 +2,39 @@ #define GEN_ASSEMBLEUR_H #define INSTRUCTION_TABLE_SIZE 1000 -#define INSTRUCTION_SIZE 100 + +#include "table_symboles.h" + +enum operation{ADD, SOU, MUL, DIV, CPY, AFC, RET, JMPF}; + +typedef struct instruction{ + enum operation operation; + int reg1; + int reg2; + int reg3; +}instruction; //table des instructions -typedef struct table{ - char* -} - -enum operation{ADD, SUB, MUL, DIV}; +typedef struct instructions_array{ + instruction array[INSTRUCTION_TABLE_SIZE]; + int index; +} instructions_array; -void gen_arithmetique(enum operation op, int arg1, int arg2); +void gen_arithmetique(instructions_array * array, enum operation op, int arg1, int arg2); + +int gen_var(Table_Symboles * table, instructions_array * array, char * varName); + +int gen_entier(Table_Symboles * table, instructions_array * array, int entier); + +int gen_return(Table_Symboles * table, instructions_array * array, int adr); + +int gen_jmpf(Table_Symboles * table, instructions_array * array, int cond); + +void update_jump(instructions_array * array, int if_value, int adr_jmp); //renvoie l'index (ou valeur?) de la premiere @ dispo -int new_temp(); +int new_temp(Table_Symboles * table); #endif \ No newline at end of file diff --git a/script.sh b/script.sh index 7f06ad4..d11fc0a 100755 --- a/script.sh +++ b/script.sh @@ -4,8 +4,11 @@ gcc -w *.c -ly echo " int main(){ const int var1 = 1, var2; - int var2; - int var3, var4 = 1; - return 1; + int var2 = 2 + 3; + int var3, var4 = 4; + if( 4){ + var2 = 6; + } + return 5; } " | ./a.out \ No newline at end of file diff --git a/table_symboles.c b/table_symboles.c index fc31bde..88fb82f 100644 --- a/table_symboles.c +++ b/table_symboles.c @@ -41,17 +41,12 @@ int add_symbole_top(Table_Symboles * table, char * varName, enum Symbole_Type ty return 0; } -int add_symbole_bottom(Table_Symboles * table, char * varName, enum Symbole_Type type, enum Initialised_Variable init){ +int add_symbole_bottom(Table_Symboles * table){ Symbole symbole; - strcpy(symbole.Variable_Name, varName); symbole.addr = table->indexAvailableBottom; - symbole.init = init; - symbole.type = type; //symbole.symbole_depth = -1; if (table->indexAvailableTop >= table->indexAvailableBottom){ return -1; - } else if (variable_exists(table, varName) != 0){ - return -2; } else { table->array[table->indexAvailableBottom] = symbole; table->indexAvailableBottom--; @@ -76,6 +71,10 @@ int remove_symboles(Table_Symboles * table, int depth){ return 0; } +void free_temp(Table_Symboles * table){ + table->indexAvailableBottom++; +} + int initialise_symbole(Table_Symboles * table, char * varName){ int index = variable_exists(table, varName); if (index == -1){ diff --git a/table_symboles.h b/table_symboles.h index 1774420..acdc1fc 100644 --- a/table_symboles.h +++ b/table_symboles.h @@ -41,12 +41,11 @@ int add_symbole_top(Table_Symboles * table, char * varName, enum Symbole_Type ty /** * Adds a symbole at the bottom (temp variables) * @param table - * @param varName - * @param type - * @param init * @return 0 if symbole added successfully, -1 if the table is full and -2 if the varaible already exists in the table */ -int add_symbole_bottom(Table_Symboles * table, char * varName, enum Symbole_Type type , enum Initialised_Variable init); +int add_symbole_bottom(Table_Symboles * table); + + /** * Verifies if a varaible name is already present in the table to avoid duplicates @@ -64,6 +63,9 @@ int variable_exists(Table_Symboles * table, char * varName); */ int remove_symboles(Table_Symboles * table, int depth); + +void free_temp(Table_Symboles * table); + /** * Initialises an already exisiting symbole * @param table