From cb0c7ac2e0f5ffc4a9b1480a041aac2ced98bd4f Mon Sep 17 00:00:00 2001 From: Jan-Niclas Loosen Date: Thu, 20 Nov 2025 22:09:31 +0100 Subject: [PATCH] Fix parsing error --- Project-02/Source.gv.png | Bin 19444 -> 35887 bytes Project-02/parser.out | 1114 +++++++++++++------------ Project-02/parsetab.py | 36 +- Project-02/triplalex.py | 10 +- Project-02/triplaprograms/func.tripla | 4 +- Project-02/triplayacc.py | 9 +- 6 files changed, 593 insertions(+), 580 deletions(-) diff --git a/Project-02/Source.gv.png b/Project-02/Source.gv.png index a3eb0b27be0c3c4160e897a59561488da0b053f2..115471447a025becbff5ae358611902f42399ecd 100644 GIT binary patch literal 35887 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 literal 19444 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 U2;aPnukj+ODQPPfD_Gq8KaskohyVZp diff --git a/Project-02/parser.out b/Project-02/parser.out index 2bbd535..c9549bd 100644 --- a/Project-02/parser.out +++ b/Project-02/parser.out @@ -11,8 +11,8 @@ Rule 5 E -> LPAREN E RPAREN Rule 6 E -> CONST Rule 7 E -> ID ASSIGN E Rule 8 E -> E SEMICOLON E -Rule 9 E -> IF LPAREN B RPAREN THEN E ELSE E -Rule 10 E -> WHILE LPAREN B RPAREN DO LBRACE E RBRACE +Rule 9 E -> IF B THEN E ELSE E +Rule 10 E -> WHILE B DO LBRACE E RBRACE Rule 11 A -> E Rule 12 A -> A COMMA E Rule 13 D -> ID LPAREN V RPAREN LBRACE E RBRACE @@ -44,9 +44,9 @@ IN : 1 LBRACE : 10 13 LET : 1 LOP : 20 -LPAREN : 3 5 9 10 13 23 +LPAREN : 3 5 13 23 RBRACE : 10 13 -RPAREN : 3 5 9 10 13 23 +RPAREN : 3 5 13 23 SEMICOLON : 8 THEN : 9 TRUE : 21 @@ -74,8 +74,8 @@ state 0 (6) E -> . CONST (7) E -> . ID ASSIGN E (8) E -> . E SEMICOLON E - (9) E -> . IF LPAREN B RPAREN THEN E ELSE E - (10) E -> . WHILE LPAREN B RPAREN DO LBRACE E RBRACE + (9) E -> . IF B THEN E ELSE E + (10) E -> . WHILE B DO LBRACE E RBRACE LET shift and go to state 2 ID shift and go to state 3 @@ -116,11 +116,13 @@ state 3 SEMICOLON reduce using rule 2 (E -> ID .) $end reduce using rule 2 (E -> ID .) RPAREN reduce using rule 2 (E -> ID .) - COMMA reduce using rule 2 (E -> ID .) EQOP reduce using rule 2 (E -> ID .) COMP reduce using rule 2 (E -> ID .) - LOP reduce using rule 2 (E -> ID .) + COMMA reduce using rule 2 (E -> ID .) ELSE reduce using rule 2 (E -> ID .) + THEN reduce using rule 2 (E -> ID .) + LOP reduce using rule 2 (E -> ID .) + DO reduce using rule 2 (E -> ID .) RBRACE reduce using rule 2 (E -> ID .) LPAREN shift and go to state 12 ASSIGN shift and go to state 13 @@ -137,8 +139,8 @@ state 4 (6) E -> . CONST (7) E -> . ID ASSIGN E (8) E -> . E SEMICOLON E - (9) E -> . IF LPAREN B RPAREN THEN E ELSE E - (10) E -> . WHILE LPAREN B RPAREN DO LBRACE E RBRACE + (9) E -> . IF B THEN E ELSE E + (10) E -> . WHILE B DO LBRACE E RBRACE LET shift and go to state 2 ID shift and go to state 3 @@ -157,27 +159,81 @@ state 5 SEMICOLON reduce using rule 6 (E -> CONST .) $end reduce using rule 6 (E -> CONST .) RPAREN reduce using rule 6 (E -> CONST .) - COMMA reduce using rule 6 (E -> CONST .) EQOP reduce using rule 6 (E -> CONST .) COMP reduce using rule 6 (E -> CONST .) - LOP reduce using rule 6 (E -> CONST .) + COMMA reduce using rule 6 (E -> CONST .) ELSE reduce using rule 6 (E -> CONST .) + THEN reduce using rule 6 (E -> CONST .) + LOP reduce using rule 6 (E -> CONST .) + DO reduce using rule 6 (E -> CONST .) RBRACE reduce using rule 6 (E -> CONST .) state 6 - (9) E -> IF . LPAREN B RPAREN THEN E ELSE E + (9) E -> IF . B THEN E ELSE E + (17) B -> . E EQOP E + (18) B -> . E COMP E + (19) B -> . B EQOP B + (20) B -> . B LOP B + (21) B -> . TRUE + (22) B -> . FALSE + (23) B -> . LPAREN B RPAREN + (1) E -> . LET D IN E + (2) E -> . ID + (3) E -> . ID LPAREN A RPAREN + (4) E -> . E AOP E + (5) E -> . LPAREN E RPAREN + (6) E -> . CONST + (7) E -> . ID ASSIGN E + (8) E -> . E SEMICOLON E + (9) E -> . IF B THEN E ELSE E + (10) E -> . WHILE B DO LBRACE E RBRACE - LPAREN shift and go to state 15 + TRUE shift and go to state 17 + FALSE shift and go to state 18 + LPAREN shift and go to state 19 + LET shift and go to state 2 + ID shift and go to state 3 + CONST shift and go to state 5 + IF shift and go to state 6 + WHILE shift and go to state 7 + B shift and go to state 15 + E shift and go to state 16 state 7 - (10) E -> WHILE . LPAREN B RPAREN DO LBRACE E RBRACE + (10) E -> WHILE . B DO LBRACE E RBRACE + (17) B -> . E EQOP E + (18) B -> . E COMP E + (19) B -> . B EQOP B + (20) B -> . B LOP B + (21) B -> . TRUE + (22) B -> . FALSE + (23) B -> . LPAREN B RPAREN + (1) E -> . LET D IN E + (2) E -> . ID + (3) E -> . ID LPAREN A RPAREN + (4) E -> . E AOP E + (5) E -> . LPAREN E RPAREN + (6) E -> . CONST + (7) E -> . ID ASSIGN E + (8) E -> . E SEMICOLON E + (9) E -> . IF B THEN E ELSE E + (10) E -> . WHILE B DO LBRACE E RBRACE - LPAREN shift and go to state 16 + TRUE shift and go to state 17 + FALSE shift and go to state 18 + LPAREN shift and go to state 19 + LET shift and go to state 2 + ID shift and go to state 3 + CONST shift and go to state 5 + IF shift and go to state 6 + WHILE shift and go to state 7 + B shift and go to state 20 + E shift and go to state 16 state 8 @@ -190,8 +246,8 @@ state 8 (6) E -> . CONST (7) E -> . ID ASSIGN E (8) E -> . E SEMICOLON E - (9) E -> . IF LPAREN B RPAREN THEN E ELSE E - (10) E -> . WHILE LPAREN B RPAREN DO LBRACE E RBRACE + (9) E -> . IF B THEN E ELSE E + (10) E -> . WHILE B DO LBRACE E RBRACE LET shift and go to state 2 ID shift and go to state 3 @@ -200,7 +256,7 @@ state 8 IF shift and go to state 6 WHILE shift and go to state 7 - E shift and go to state 17 + E shift and go to state 21 state 9 @@ -213,8 +269,8 @@ state 9 (6) E -> . CONST (7) E -> . ID ASSIGN E (8) E -> . E SEMICOLON E - (9) E -> . IF LPAREN B RPAREN THEN E ELSE E - (10) E -> . WHILE LPAREN B RPAREN DO LBRACE E RBRACE + (9) E -> . IF B THEN E ELSE E + (10) E -> . WHILE B DO LBRACE E RBRACE LET shift and go to state 2 ID shift and go to state 3 @@ -223,7 +279,7 @@ state 9 IF shift and go to state 6 WHILE shift and go to state 7 - E shift and go to state 18 + E shift and go to state 22 state 10 @@ -232,16 +288,16 @@ state 10 (13) D -> . ID LPAREN V RPAREN LBRACE E RBRACE (14) D -> . D D - IN shift and go to state 20 + IN shift and go to state 24 ID shift and go to state 11 - D shift and go to state 19 + D shift and go to state 23 state 11 (13) D -> ID . LPAREN V RPAREN LBRACE E RBRACE - LPAREN shift and go to state 21 + LPAREN shift and go to state 25 state 12 @@ -257,8 +313,8 @@ state 12 (6) E -> . CONST (7) E -> . ID ASSIGN E (8) E -> . E SEMICOLON E - (9) E -> . IF LPAREN B RPAREN THEN E ELSE E - (10) E -> . WHILE LPAREN B RPAREN DO LBRACE E RBRACE + (9) E -> . IF B THEN E ELSE E + (10) E -> . WHILE B DO LBRACE E RBRACE LET shift and go to state 2 ID shift and go to state 3 @@ -267,8 +323,8 @@ state 12 IF shift and go to state 6 WHILE shift and go to state 7 - A shift and go to state 22 - E shift and go to state 23 + A shift and go to state 26 + E shift and go to state 27 state 13 @@ -281,8 +337,8 @@ state 13 (6) E -> . CONST (7) E -> . ID ASSIGN E (8) E -> . E SEMICOLON E - (9) E -> . IF LPAREN B RPAREN THEN E ELSE E - (10) E -> . WHILE LPAREN B RPAREN DO LBRACE E RBRACE + (9) E -> . IF B THEN E ELSE E + (10) E -> . WHILE B DO LBRACE E RBRACE LET shift and go to state 2 ID shift and go to state 3 @@ -291,7 +347,7 @@ state 13 IF shift and go to state 6 WHILE shift and go to state 7 - E shift and go to state 24 + E shift and go to state 28 state 14 @@ -299,231 +355,59 @@ state 14 (4) E -> E . AOP E (8) E -> E . SEMICOLON E - RPAREN shift and go to state 25 + RPAREN shift and go to state 29 AOP shift and go to state 8 SEMICOLON shift and go to state 9 state 15 - (9) E -> IF LPAREN . B RPAREN THEN E ELSE E - (17) B -> . E EQOP E - (18) B -> . E COMP E - (19) B -> . B EQOP B - (20) B -> . B LOP B - (21) B -> . TRUE - (22) B -> . FALSE - (23) B -> . LPAREN B RPAREN - (1) E -> . LET D IN E - (2) E -> . ID - (3) E -> . ID LPAREN A RPAREN - (4) E -> . E AOP E - (5) E -> . LPAREN E RPAREN - (6) E -> . CONST - (7) E -> . ID ASSIGN E - (8) E -> . E SEMICOLON E - (9) E -> . IF LPAREN B RPAREN THEN E ELSE E - (10) E -> . WHILE LPAREN B RPAREN DO LBRACE E RBRACE + (9) E -> IF B . THEN E ELSE E + (19) B -> B . EQOP B + (20) B -> B . LOP B - TRUE shift and go to state 29 - FALSE shift and go to state 30 - LPAREN shift and go to state 26 - LET shift and go to state 2 - ID shift and go to state 3 - CONST shift and go to state 5 - IF shift and go to state 6 - WHILE shift and go to state 7 + THEN shift and go to state 30 + EQOP shift and go to state 31 + LOP shift and go to state 32 - B shift and go to state 27 - E shift and go to state 28 state 16 - (10) E -> WHILE LPAREN . B RPAREN DO LBRACE E RBRACE - (17) B -> . E EQOP E - (18) B -> . E COMP E - (19) B -> . B EQOP B - (20) B -> . B LOP B - (21) B -> . TRUE - (22) B -> . FALSE - (23) B -> . LPAREN B RPAREN - (1) E -> . LET D IN E - (2) E -> . ID - (3) E -> . ID LPAREN A RPAREN - (4) E -> . E AOP E - (5) E -> . LPAREN E RPAREN - (6) E -> . CONST - (7) E -> . ID ASSIGN E - (8) E -> . E SEMICOLON E - (9) E -> . IF LPAREN B RPAREN THEN E ELSE E - (10) E -> . WHILE LPAREN B RPAREN DO LBRACE E RBRACE - - TRUE shift and go to state 29 - FALSE shift and go to state 30 - LPAREN shift and go to state 26 - LET shift and go to state 2 - ID shift and go to state 3 - CONST shift and go to state 5 - IF shift and go to state 6 - WHILE shift and go to state 7 - - B shift and go to state 31 - E shift and go to state 28 - -state 17 - - (4) E -> E AOP E . + (17) B -> E . EQOP E + (18) B -> E . COMP E (4) E -> E . AOP E (8) E -> E . SEMICOLON E - AOP reduce using rule 4 (E -> E AOP E .) - SEMICOLON reduce using rule 4 (E -> E AOP E .) - $end reduce using rule 4 (E -> E AOP E .) - RPAREN reduce using rule 4 (E -> E AOP E .) - COMMA reduce using rule 4 (E -> E AOP E .) - EQOP reduce using rule 4 (E -> E AOP E .) - COMP reduce using rule 4 (E -> E AOP E .) - LOP reduce using rule 4 (E -> E AOP E .) - ELSE reduce using rule 4 (E -> E AOP E .) - RBRACE reduce using rule 4 (E -> E AOP E .) + EQOP shift and go to state 33 + COMP shift and go to state 34 + AOP shift and go to state 8 + SEMICOLON shift and go to state 9 - ! AOP [ shift and go to state 8 ] - ! SEMICOLON [ shift and go to state 9 ] + +state 17 + + (21) B -> TRUE . + + THEN reduce using rule 21 (B -> TRUE .) + EQOP reduce using rule 21 (B -> TRUE .) + LOP reduce using rule 21 (B -> TRUE .) + DO reduce using rule 21 (B -> TRUE .) + RPAREN reduce using rule 21 (B -> TRUE .) state 18 - (8) E -> E SEMICOLON E . - (4) E -> E . AOP E - (8) E -> E . SEMICOLON E + (22) B -> FALSE . - ! shift/reduce conflict for AOP resolved as shift - ! shift/reduce conflict for SEMICOLON resolved as shift - $end reduce using rule 8 (E -> E SEMICOLON E .) - RPAREN reduce using rule 8 (E -> E SEMICOLON E .) - COMMA reduce using rule 8 (E -> E SEMICOLON E .) - EQOP reduce using rule 8 (E -> E SEMICOLON E .) - COMP reduce using rule 8 (E -> E SEMICOLON E .) - LOP reduce using rule 8 (E -> E SEMICOLON E .) - ELSE reduce using rule 8 (E -> E SEMICOLON E .) - RBRACE reduce using rule 8 (E -> E SEMICOLON E .) - AOP shift and go to state 8 - SEMICOLON shift and go to state 9 - - ! AOP [ reduce using rule 8 (E -> E SEMICOLON E .) ] - ! SEMICOLON [ reduce using rule 8 (E -> E SEMICOLON E .) ] + THEN reduce using rule 22 (B -> FALSE .) + EQOP reduce using rule 22 (B -> FALSE .) + LOP reduce using rule 22 (B -> FALSE .) + DO reduce using rule 22 (B -> FALSE .) + RPAREN reduce using rule 22 (B -> FALSE .) state 19 - (14) D -> D D . - (14) D -> D . D - (13) D -> . ID LPAREN V RPAREN LBRACE E RBRACE - (14) D -> . D D - - ! shift/reduce conflict for ID resolved as shift - IN reduce using rule 14 (D -> D D .) - ID shift and go to state 11 - - ! ID [ reduce using rule 14 (D -> D D .) ] - - D shift and go to state 19 - -state 20 - - (1) E -> LET D IN . E - (1) E -> . LET D IN E - (2) E -> . ID - (3) E -> . ID LPAREN A RPAREN - (4) E -> . E AOP E - (5) E -> . LPAREN E RPAREN - (6) E -> . CONST - (7) E -> . ID ASSIGN E - (8) E -> . E SEMICOLON E - (9) E -> . IF LPAREN B RPAREN THEN E ELSE E - (10) E -> . WHILE LPAREN B RPAREN DO LBRACE E RBRACE - - LET shift and go to state 2 - ID shift and go to state 3 - LPAREN shift and go to state 4 - CONST shift and go to state 5 - IF shift and go to state 6 - WHILE shift and go to state 7 - - E shift and go to state 32 - -state 21 - - (13) D -> ID LPAREN . V RPAREN LBRACE E RBRACE - (15) V -> . ID - (16) V -> . V COMMA ID - - ID shift and go to state 33 - - V shift and go to state 34 - -state 22 - - (3) E -> ID LPAREN A . RPAREN - (12) A -> A . COMMA E - - RPAREN shift and go to state 35 - COMMA shift and go to state 36 - - -state 23 - - (11) A -> E . - (4) E -> E . AOP E - (8) E -> E . SEMICOLON E - - RPAREN reduce using rule 11 (A -> E .) - COMMA reduce using rule 11 (A -> E .) - AOP shift and go to state 8 - SEMICOLON shift and go to state 9 - - -state 24 - - (7) E -> ID ASSIGN E . - (4) E -> E . AOP E - (8) E -> E . SEMICOLON E - - ! shift/reduce conflict for AOP resolved as shift - ! shift/reduce conflict for SEMICOLON resolved as shift - $end reduce using rule 7 (E -> ID ASSIGN E .) - RPAREN reduce using rule 7 (E -> ID ASSIGN E .) - COMMA reduce using rule 7 (E -> ID ASSIGN E .) - EQOP reduce using rule 7 (E -> ID ASSIGN E .) - COMP reduce using rule 7 (E -> ID ASSIGN E .) - LOP reduce using rule 7 (E -> ID ASSIGN E .) - ELSE reduce using rule 7 (E -> ID ASSIGN E .) - RBRACE reduce using rule 7 (E -> ID ASSIGN E .) - AOP shift and go to state 8 - SEMICOLON shift and go to state 9 - - ! AOP [ reduce using rule 7 (E -> ID ASSIGN E .) ] - ! SEMICOLON [ reduce using rule 7 (E -> ID ASSIGN E .) ] - - -state 25 - - (5) E -> LPAREN E RPAREN . - - AOP reduce using rule 5 (E -> LPAREN E RPAREN .) - SEMICOLON reduce using rule 5 (E -> LPAREN E RPAREN .) - $end reduce using rule 5 (E -> LPAREN E RPAREN .) - RPAREN reduce using rule 5 (E -> LPAREN E RPAREN .) - COMMA reduce using rule 5 (E -> LPAREN E RPAREN .) - EQOP reduce using rule 5 (E -> LPAREN E RPAREN .) - COMP reduce using rule 5 (E -> LPAREN E RPAREN .) - LOP reduce using rule 5 (E -> LPAREN E RPAREN .) - ELSE reduce using rule 5 (E -> LPAREN E RPAREN .) - RBRACE reduce using rule 5 (E -> LPAREN E RPAREN .) - - -state 26 - (23) B -> LPAREN . B RPAREN (5) E -> LPAREN . E RPAREN (17) B -> . E EQOP E @@ -541,133 +425,98 @@ state 26 (6) E -> . CONST (7) E -> . ID ASSIGN E (8) E -> . E SEMICOLON E - (9) E -> . IF LPAREN B RPAREN THEN E ELSE E - (10) E -> . WHILE LPAREN B RPAREN DO LBRACE E RBRACE + (9) E -> . IF B THEN E ELSE E + (10) E -> . WHILE B DO LBRACE E RBRACE - TRUE shift and go to state 29 - FALSE shift and go to state 30 - LPAREN shift and go to state 26 + TRUE shift and go to state 17 + FALSE shift and go to state 18 + LPAREN shift and go to state 19 LET shift and go to state 2 ID shift and go to state 3 CONST shift and go to state 5 IF shift and go to state 6 WHILE shift and go to state 7 - B shift and go to state 37 - E shift and go to state 38 + B shift and go to state 35 + E shift and go to state 36 -state 27 +state 20 - (9) E -> IF LPAREN B . RPAREN THEN E ELSE E + (10) E -> WHILE B . DO LBRACE E RBRACE (19) B -> B . EQOP B (20) B -> B . LOP B - RPAREN shift and go to state 39 - EQOP shift and go to state 40 - LOP shift and go to state 41 + DO shift and go to state 37 + EQOP shift and go to state 31 + LOP shift and go to state 32 -state 28 +state 21 - (17) B -> E . EQOP E - (18) B -> E . COMP E + (4) E -> E AOP E . (4) E -> E . AOP E (8) E -> E . SEMICOLON E - EQOP shift and go to state 42 - COMP shift and go to state 43 - AOP shift and go to state 8 - SEMICOLON shift and go to state 9 + AOP reduce using rule 4 (E -> E AOP E .) + SEMICOLON reduce using rule 4 (E -> E AOP E .) + $end reduce using rule 4 (E -> E AOP E .) + RPAREN reduce using rule 4 (E -> E AOP E .) + EQOP reduce using rule 4 (E -> E AOP E .) + COMP reduce using rule 4 (E -> E AOP E .) + COMMA reduce using rule 4 (E -> E AOP E .) + ELSE reduce using rule 4 (E -> E AOP E .) + THEN reduce using rule 4 (E -> E AOP E .) + LOP reduce using rule 4 (E -> E AOP E .) + DO reduce using rule 4 (E -> E AOP E .) + RBRACE reduce using rule 4 (E -> E AOP E .) + + ! AOP [ shift and go to state 8 ] + ! SEMICOLON [ shift and go to state 9 ] -state 29 +state 22 - (21) B -> TRUE . - - RPAREN reduce using rule 21 (B -> TRUE .) - EQOP reduce using rule 21 (B -> TRUE .) - LOP reduce using rule 21 (B -> TRUE .) - - -state 30 - - (22) B -> FALSE . - - RPAREN reduce using rule 22 (B -> FALSE .) - EQOP reduce using rule 22 (B -> FALSE .) - LOP reduce using rule 22 (B -> FALSE .) - - -state 31 - - (10) E -> WHILE LPAREN B . RPAREN DO LBRACE E RBRACE - (19) B -> B . EQOP B - (20) B -> B . LOP B - - RPAREN shift and go to state 44 - EQOP shift and go to state 40 - LOP shift and go to state 41 - - -state 32 - - (1) E -> LET D IN E . + (8) E -> E SEMICOLON E . (4) E -> E . AOP E (8) E -> E . SEMICOLON E ! shift/reduce conflict for AOP resolved as shift ! shift/reduce conflict for SEMICOLON resolved as shift - $end reduce using rule 1 (E -> LET D IN E .) - RPAREN reduce using rule 1 (E -> LET D IN E .) - COMMA reduce using rule 1 (E -> LET D IN E .) - EQOP reduce using rule 1 (E -> LET D IN E .) - COMP reduce using rule 1 (E -> LET D IN E .) - LOP reduce using rule 1 (E -> LET D IN E .) - ELSE reduce using rule 1 (E -> LET D IN E .) - RBRACE reduce using rule 1 (E -> LET D IN E .) + $end reduce using rule 8 (E -> E SEMICOLON E .) + RPAREN reduce using rule 8 (E -> E SEMICOLON E .) + EQOP reduce using rule 8 (E -> E SEMICOLON E .) + COMP reduce using rule 8 (E -> E SEMICOLON E .) + COMMA reduce using rule 8 (E -> E SEMICOLON E .) + ELSE reduce using rule 8 (E -> E SEMICOLON E .) + THEN reduce using rule 8 (E -> E SEMICOLON E .) + LOP reduce using rule 8 (E -> E SEMICOLON E .) + DO reduce using rule 8 (E -> E SEMICOLON E .) + RBRACE reduce using rule 8 (E -> E SEMICOLON E .) AOP shift and go to state 8 SEMICOLON shift and go to state 9 - ! AOP [ reduce using rule 1 (E -> LET D IN E .) ] - ! SEMICOLON [ reduce using rule 1 (E -> LET D IN E .) ] + ! AOP [ reduce using rule 8 (E -> E SEMICOLON E .) ] + ! SEMICOLON [ reduce using rule 8 (E -> E SEMICOLON E .) ] -state 33 +state 23 - (15) V -> ID . + (14) D -> D D . + (14) D -> D . D + (13) D -> . ID LPAREN V RPAREN LBRACE E RBRACE + (14) D -> . D D - RPAREN reduce using rule 15 (V -> ID .) - COMMA reduce using rule 15 (V -> ID .) + ! shift/reduce conflict for ID resolved as shift + IN reduce using rule 14 (D -> D D .) + ID shift and go to state 11 + ! ID [ reduce using rule 14 (D -> D D .) ] -state 34 + D shift and go to state 23 - (13) D -> ID LPAREN V . RPAREN LBRACE E RBRACE - (16) V -> V . COMMA ID +state 24 - RPAREN shift and go to state 45 - COMMA shift and go to state 46 - - -state 35 - - (3) E -> ID LPAREN A RPAREN . - - AOP reduce using rule 3 (E -> ID LPAREN A RPAREN .) - SEMICOLON reduce using rule 3 (E -> ID LPAREN A RPAREN .) - $end reduce using rule 3 (E -> ID LPAREN A RPAREN .) - RPAREN reduce using rule 3 (E -> ID LPAREN A RPAREN .) - COMMA reduce using rule 3 (E -> ID LPAREN A RPAREN .) - EQOP reduce using rule 3 (E -> ID LPAREN A RPAREN .) - COMP reduce using rule 3 (E -> ID LPAREN A RPAREN .) - LOP reduce using rule 3 (E -> ID LPAREN A RPAREN .) - ELSE reduce using rule 3 (E -> ID LPAREN A RPAREN .) - RBRACE reduce using rule 3 (E -> ID LPAREN A RPAREN .) - - -state 36 - - (12) A -> A COMMA . E + (1) E -> LET D IN . E (1) E -> . LET D IN E (2) E -> . ID (3) E -> . ID LPAREN A RPAREN @@ -676,8 +525,8 @@ state 36 (6) E -> . CONST (7) E -> . ID ASSIGN E (8) E -> . E SEMICOLON E - (9) E -> . IF LPAREN B RPAREN THEN E ELSE E - (10) E -> . WHILE LPAREN B RPAREN DO LBRACE E RBRACE + (9) E -> . IF B THEN E ELSE E + (10) E -> . WHILE B DO LBRACE E RBRACE LET shift and go to state 2 ID shift and go to state 3 @@ -686,42 +535,106 @@ state 36 IF shift and go to state 6 WHILE shift and go to state 7 - E shift and go to state 47 + E shift and go to state 38 -state 37 +state 25 - (23) B -> LPAREN B . RPAREN - (19) B -> B . EQOP B - (20) B -> B . LOP B + (13) D -> ID LPAREN . V RPAREN LBRACE E RBRACE + (15) V -> . ID + (16) V -> . V COMMA ID - RPAREN shift and go to state 48 - EQOP shift and go to state 40 - LOP shift and go to state 41 + ID shift and go to state 39 + + V shift and go to state 40 + +state 26 + + (3) E -> ID LPAREN A . RPAREN + (12) A -> A . COMMA E + + RPAREN shift and go to state 41 + COMMA shift and go to state 42 -state 38 +state 27 - (5) E -> LPAREN E . RPAREN - (17) B -> E . EQOP E - (18) B -> E . COMP E + (11) A -> E . (4) E -> E . AOP E (8) E -> E . SEMICOLON E - RPAREN shift and go to state 25 - EQOP shift and go to state 42 - COMP shift and go to state 43 + RPAREN reduce using rule 11 (A -> E .) + COMMA reduce using rule 11 (A -> E .) AOP shift and go to state 8 SEMICOLON shift and go to state 9 -state 39 +state 28 - (9) E -> IF LPAREN B RPAREN . THEN E ELSE E + (7) E -> ID ASSIGN E . + (4) E -> E . AOP E + (8) E -> E . SEMICOLON E - THEN shift and go to state 49 + ! shift/reduce conflict for AOP resolved as shift + ! shift/reduce conflict for SEMICOLON resolved as shift + $end reduce using rule 7 (E -> ID ASSIGN E .) + RPAREN reduce using rule 7 (E -> ID ASSIGN E .) + EQOP reduce using rule 7 (E -> ID ASSIGN E .) + COMP reduce using rule 7 (E -> ID ASSIGN E .) + COMMA reduce using rule 7 (E -> ID ASSIGN E .) + ELSE reduce using rule 7 (E -> ID ASSIGN E .) + THEN reduce using rule 7 (E -> ID ASSIGN E .) + LOP reduce using rule 7 (E -> ID ASSIGN E .) + DO reduce using rule 7 (E -> ID ASSIGN E .) + RBRACE reduce using rule 7 (E -> ID ASSIGN E .) + AOP shift and go to state 8 + SEMICOLON shift and go to state 9 + + ! AOP [ reduce using rule 7 (E -> ID ASSIGN E .) ] + ! SEMICOLON [ reduce using rule 7 (E -> ID ASSIGN E .) ] -state 40 +state 29 + + (5) E -> LPAREN E RPAREN . + + AOP reduce using rule 5 (E -> LPAREN E RPAREN .) + SEMICOLON reduce using rule 5 (E -> LPAREN E RPAREN .) + $end reduce using rule 5 (E -> LPAREN E RPAREN .) + RPAREN reduce using rule 5 (E -> LPAREN E RPAREN .) + EQOP reduce using rule 5 (E -> LPAREN E RPAREN .) + COMP reduce using rule 5 (E -> LPAREN E RPAREN .) + COMMA reduce using rule 5 (E -> LPAREN E RPAREN .) + ELSE reduce using rule 5 (E -> LPAREN E RPAREN .) + THEN reduce using rule 5 (E -> LPAREN E RPAREN .) + LOP reduce using rule 5 (E -> LPAREN E RPAREN .) + DO reduce using rule 5 (E -> LPAREN E RPAREN .) + RBRACE reduce using rule 5 (E -> LPAREN E RPAREN .) + + +state 30 + + (9) E -> IF B THEN . E ELSE E + (1) E -> . LET D IN E + (2) E -> . ID + (3) E -> . ID LPAREN A RPAREN + (4) E -> . E AOP E + (5) E -> . LPAREN E RPAREN + (6) E -> . CONST + (7) E -> . ID ASSIGN E + (8) E -> . E SEMICOLON E + (9) E -> . IF B THEN E ELSE E + (10) E -> . WHILE B DO LBRACE E RBRACE + + LET shift and go to state 2 + ID shift and go to state 3 + LPAREN shift and go to state 4 + CONST shift and go to state 5 + IF shift and go to state 6 + WHILE shift and go to state 7 + + E shift and go to state 43 + +state 31 (19) B -> B EQOP . B (17) B -> . E EQOP E @@ -739,22 +652,22 @@ state 40 (6) E -> . CONST (7) E -> . ID ASSIGN E (8) E -> . E SEMICOLON E - (9) E -> . IF LPAREN B RPAREN THEN E ELSE E - (10) E -> . WHILE LPAREN B RPAREN DO LBRACE E RBRACE + (9) E -> . IF B THEN E ELSE E + (10) E -> . WHILE B DO LBRACE E RBRACE - TRUE shift and go to state 29 - FALSE shift and go to state 30 - LPAREN shift and go to state 26 + TRUE shift and go to state 17 + FALSE shift and go to state 18 + LPAREN shift and go to state 19 LET shift and go to state 2 ID shift and go to state 3 CONST shift and go to state 5 IF shift and go to state 6 WHILE shift and go to state 7 - B shift and go to state 50 - E shift and go to state 28 + B shift and go to state 44 + E shift and go to state 16 -state 41 +state 32 (20) B -> B LOP . B (17) B -> . E EQOP E @@ -772,22 +685,22 @@ state 41 (6) E -> . CONST (7) E -> . ID ASSIGN E (8) E -> . E SEMICOLON E - (9) E -> . IF LPAREN B RPAREN THEN E ELSE E - (10) E -> . WHILE LPAREN B RPAREN DO LBRACE E RBRACE + (9) E -> . IF B THEN E ELSE E + (10) E -> . WHILE B DO LBRACE E RBRACE - TRUE shift and go to state 29 - FALSE shift and go to state 30 - LPAREN shift and go to state 26 + TRUE shift and go to state 17 + FALSE shift and go to state 18 + LPAREN shift and go to state 19 LET shift and go to state 2 ID shift and go to state 3 CONST shift and go to state 5 IF shift and go to state 6 WHILE shift and go to state 7 - B shift and go to state 51 - E shift and go to state 28 + B shift and go to state 45 + E shift and go to state 16 -state 42 +state 33 (17) B -> E EQOP . E (1) E -> . LET D IN E @@ -798,8 +711,147 @@ state 42 (6) E -> . CONST (7) E -> . ID ASSIGN E (8) E -> . E SEMICOLON E - (9) E -> . IF LPAREN B RPAREN THEN E ELSE E - (10) E -> . WHILE LPAREN B RPAREN DO LBRACE E RBRACE + (9) E -> . IF B THEN E ELSE E + (10) E -> . WHILE B DO LBRACE E RBRACE + + LET shift and go to state 2 + ID shift and go to state 3 + LPAREN shift and go to state 4 + CONST shift and go to state 5 + IF shift and go to state 6 + WHILE shift and go to state 7 + + E shift and go to state 46 + +state 34 + + (18) B -> E COMP . E + (1) E -> . LET D IN E + (2) E -> . ID + (3) E -> . ID LPAREN A RPAREN + (4) E -> . E AOP E + (5) E -> . LPAREN E RPAREN + (6) E -> . CONST + (7) E -> . ID ASSIGN E + (8) E -> . E SEMICOLON E + (9) E -> . IF B THEN E ELSE E + (10) E -> . WHILE B DO LBRACE E RBRACE + + LET shift and go to state 2 + ID shift and go to state 3 + LPAREN shift and go to state 4 + CONST shift and go to state 5 + IF shift and go to state 6 + WHILE shift and go to state 7 + + E shift and go to state 47 + +state 35 + + (23) B -> LPAREN B . RPAREN + (19) B -> B . EQOP B + (20) B -> B . LOP B + + RPAREN shift and go to state 48 + EQOP shift and go to state 31 + LOP shift and go to state 32 + + +state 36 + + (5) E -> LPAREN E . RPAREN + (17) B -> E . EQOP E + (18) B -> E . COMP E + (4) E -> E . AOP E + (8) E -> E . SEMICOLON E + + RPAREN shift and go to state 29 + EQOP shift and go to state 33 + COMP shift and go to state 34 + AOP shift and go to state 8 + SEMICOLON shift and go to state 9 + + +state 37 + + (10) E -> WHILE B DO . LBRACE E RBRACE + + LBRACE shift and go to state 49 + + +state 38 + + (1) E -> LET D IN E . + (4) E -> E . AOP E + (8) E -> E . SEMICOLON E + + ! shift/reduce conflict for AOP resolved as shift + ! shift/reduce conflict for SEMICOLON resolved as shift + $end reduce using rule 1 (E -> LET D IN E .) + RPAREN reduce using rule 1 (E -> LET D IN E .) + EQOP reduce using rule 1 (E -> LET D IN E .) + COMP reduce using rule 1 (E -> LET D IN E .) + COMMA reduce using rule 1 (E -> LET D IN E .) + ELSE reduce using rule 1 (E -> LET D IN E .) + THEN reduce using rule 1 (E -> LET D IN E .) + LOP reduce using rule 1 (E -> LET D IN E .) + DO reduce using rule 1 (E -> LET D IN E .) + RBRACE reduce using rule 1 (E -> LET D IN E .) + AOP shift and go to state 8 + SEMICOLON shift and go to state 9 + + ! AOP [ reduce using rule 1 (E -> LET D IN E .) ] + ! SEMICOLON [ reduce using rule 1 (E -> LET D IN E .) ] + + +state 39 + + (15) V -> ID . + + RPAREN reduce using rule 15 (V -> ID .) + COMMA reduce using rule 15 (V -> ID .) + + +state 40 + + (13) D -> ID LPAREN V . RPAREN LBRACE E RBRACE + (16) V -> V . COMMA ID + + RPAREN shift and go to state 50 + COMMA shift and go to state 51 + + +state 41 + + (3) E -> ID LPAREN A RPAREN . + + AOP reduce using rule 3 (E -> ID LPAREN A RPAREN .) + SEMICOLON reduce using rule 3 (E -> ID LPAREN A RPAREN .) + $end reduce using rule 3 (E -> ID LPAREN A RPAREN .) + RPAREN reduce using rule 3 (E -> ID LPAREN A RPAREN .) + EQOP reduce using rule 3 (E -> ID LPAREN A RPAREN .) + COMP reduce using rule 3 (E -> ID LPAREN A RPAREN .) + COMMA reduce using rule 3 (E -> ID LPAREN A RPAREN .) + ELSE reduce using rule 3 (E -> ID LPAREN A RPAREN .) + THEN reduce using rule 3 (E -> ID LPAREN A RPAREN .) + LOP reduce using rule 3 (E -> ID LPAREN A RPAREN .) + DO reduce using rule 3 (E -> ID LPAREN A RPAREN .) + RBRACE reduce using rule 3 (E -> ID LPAREN A RPAREN .) + + +state 42 + + (12) A -> A COMMA . E + (1) E -> . LET D IN E + (2) E -> . ID + (3) E -> . ID LPAREN A RPAREN + (4) E -> . E AOP E + (5) E -> . LPAREN E RPAREN + (6) E -> . CONST + (7) E -> . ID ASSIGN E + (8) E -> . E SEMICOLON E + (9) E -> . IF B THEN E ELSE E + (10) E -> . WHILE B DO LBRACE E RBRACE LET shift and go to state 2 ID shift and go to state 3 @@ -812,7 +864,93 @@ state 42 state 43 - (18) B -> E COMP . E + (9) E -> IF B THEN E . ELSE E + (4) E -> E . AOP E + (8) E -> E . SEMICOLON E + + ELSE shift and go to state 53 + AOP shift and go to state 8 + SEMICOLON shift and go to state 9 + + +state 44 + + (19) B -> B EQOP B . + (19) B -> B . EQOP B + (20) B -> B . LOP B + + THEN reduce using rule 19 (B -> B EQOP B .) + EQOP reduce using rule 19 (B -> B EQOP B .) + LOP reduce using rule 19 (B -> B EQOP B .) + DO reduce using rule 19 (B -> B EQOP B .) + RPAREN reduce using rule 19 (B -> B EQOP B .) + + ! EQOP [ shift and go to state 31 ] + ! LOP [ shift and go to state 32 ] + + +state 45 + + (20) B -> B LOP B . + (19) B -> B . EQOP B + (20) B -> B . LOP B + + ! shift/reduce conflict for EQOP resolved as shift + ! shift/reduce conflict for LOP resolved as shift + THEN reduce using rule 20 (B -> B LOP B .) + DO reduce using rule 20 (B -> B LOP B .) + RPAREN reduce using rule 20 (B -> B LOP B .) + EQOP shift and go to state 31 + LOP shift and go to state 32 + + ! EQOP [ reduce using rule 20 (B -> B LOP B .) ] + ! LOP [ reduce using rule 20 (B -> B LOP B .) ] + + +state 46 + + (17) B -> E EQOP E . + (4) E -> E . AOP E + (8) E -> E . SEMICOLON E + + THEN reduce using rule 17 (B -> E EQOP E .) + EQOP reduce using rule 17 (B -> E EQOP E .) + LOP reduce using rule 17 (B -> E EQOP E .) + DO reduce using rule 17 (B -> E EQOP E .) + RPAREN reduce using rule 17 (B -> E EQOP E .) + AOP shift and go to state 8 + SEMICOLON shift and go to state 9 + + +state 47 + + (18) B -> E COMP E . + (4) E -> E . AOP E + (8) E -> E . SEMICOLON E + + THEN reduce using rule 18 (B -> E COMP E .) + EQOP reduce using rule 18 (B -> E COMP E .) + LOP reduce using rule 18 (B -> E COMP E .) + DO reduce using rule 18 (B -> E COMP E .) + RPAREN reduce using rule 18 (B -> E COMP E .) + AOP shift and go to state 8 + SEMICOLON shift and go to state 9 + + +state 48 + + (23) B -> LPAREN B RPAREN . + + THEN reduce using rule 23 (B -> LPAREN B RPAREN .) + EQOP reduce using rule 23 (B -> LPAREN B RPAREN .) + LOP reduce using rule 23 (B -> LPAREN B RPAREN .) + DO reduce using rule 23 (B -> LPAREN B RPAREN .) + RPAREN reduce using rule 23 (B -> LPAREN B RPAREN .) + + +state 49 + + (10) E -> WHILE B DO LBRACE . E RBRACE (1) E -> . LET D IN E (2) E -> . ID (3) E -> . ID LPAREN A RPAREN @@ -821,8 +959,8 @@ state 43 (6) E -> . CONST (7) E -> . ID ASSIGN E (8) E -> . E SEMICOLON E - (9) E -> . IF LPAREN B RPAREN THEN E ELSE E - (10) E -> . WHILE LPAREN B RPAREN DO LBRACE E RBRACE + (9) E -> . IF B THEN E ELSE E + (10) E -> . WHILE B DO LBRACE E RBRACE LET shift and go to state 2 ID shift and go to state 3 @@ -831,30 +969,23 @@ state 43 IF shift and go to state 6 WHILE shift and go to state 7 - E shift and go to state 53 + E shift and go to state 54 -state 44 - - (10) E -> WHILE LPAREN B RPAREN . DO LBRACE E RBRACE - - DO shift and go to state 54 - - -state 45 +state 50 (13) D -> ID LPAREN V RPAREN . LBRACE E RBRACE LBRACE shift and go to state 55 -state 46 +state 51 (16) V -> V COMMA . ID ID shift and go to state 56 -state 47 +state 52 (12) A -> A COMMA E . (4) E -> E . AOP E @@ -866,18 +997,9 @@ state 47 SEMICOLON shift and go to state 9 -state 48 +state 53 - (23) B -> LPAREN B RPAREN . - - RPAREN reduce using rule 23 (B -> LPAREN B RPAREN .) - EQOP reduce using rule 23 (B -> LPAREN B RPAREN .) - LOP reduce using rule 23 (B -> LPAREN B RPAREN .) - - -state 49 - - (9) E -> IF LPAREN B RPAREN THEN . E ELSE E + (9) E -> IF B THEN E ELSE . E (1) E -> . LET D IN E (2) E -> . ID (3) E -> . ID LPAREN A RPAREN @@ -886,8 +1008,8 @@ state 49 (6) E -> . CONST (7) E -> . ID ASSIGN E (8) E -> . E SEMICOLON E - (9) E -> . IF LPAREN B RPAREN THEN E ELSE E - (10) E -> . WHILE LPAREN B RPAREN DO LBRACE E RBRACE + (9) E -> . IF B THEN E ELSE E + (10) E -> . WHILE B DO LBRACE E RBRACE LET shift and go to state 2 ID shift and go to state 3 @@ -898,67 +1020,15 @@ state 49 E shift and go to state 57 -state 50 - - (19) B -> B EQOP B . - (19) B -> B . EQOP B - (20) B -> B . LOP B - - RPAREN reduce using rule 19 (B -> B EQOP B .) - EQOP reduce using rule 19 (B -> B EQOP B .) - LOP reduce using rule 19 (B -> B EQOP B .) - - ! EQOP [ shift and go to state 40 ] - ! LOP [ shift and go to state 41 ] - - -state 51 - - (20) B -> B LOP B . - (19) B -> B . EQOP B - (20) B -> B . LOP B - - ! shift/reduce conflict for EQOP resolved as shift - ! shift/reduce conflict for LOP resolved as shift - RPAREN reduce using rule 20 (B -> B LOP B .) - EQOP shift and go to state 40 - LOP shift and go to state 41 - - ! EQOP [ reduce using rule 20 (B -> B LOP B .) ] - ! LOP [ reduce using rule 20 (B -> B LOP B .) ] - - -state 52 - - (17) B -> E EQOP E . - (4) E -> E . AOP E - (8) E -> E . SEMICOLON E - - RPAREN reduce using rule 17 (B -> E EQOP E .) - EQOP reduce using rule 17 (B -> E EQOP E .) - LOP reduce using rule 17 (B -> E EQOP E .) - AOP shift and go to state 8 - SEMICOLON shift and go to state 9 - - -state 53 - - (18) B -> E COMP E . - (4) E -> E . AOP E - (8) E -> E . SEMICOLON E - - RPAREN reduce using rule 18 (B -> E COMP E .) - EQOP reduce using rule 18 (B -> E COMP E .) - LOP reduce using rule 18 (B -> E COMP E .) - AOP shift and go to state 8 - SEMICOLON shift and go to state 9 - - state 54 - (10) E -> WHILE LPAREN B RPAREN DO . LBRACE E RBRACE + (10) E -> WHILE B DO LBRACE E . RBRACE + (4) E -> E . AOP E + (8) E -> E . SEMICOLON E - LBRACE shift and go to state 58 + RBRACE shift and go to state 58 + AOP shift and go to state 8 + SEMICOLON shift and go to state 9 state 55 @@ -972,8 +1042,8 @@ state 55 (6) E -> . CONST (7) E -> . ID ASSIGN E (8) E -> . E SEMICOLON E - (9) E -> . IF LPAREN B RPAREN THEN E ELSE E - (10) E -> . WHILE LPAREN B RPAREN DO LBRACE E RBRACE + (9) E -> . IF B THEN E ELSE E + (10) E -> . WHILE B DO LBRACE E RBRACE LET shift and go to state 2 ID shift and go to state 3 @@ -994,37 +1064,46 @@ state 56 state 57 - (9) E -> IF LPAREN B RPAREN THEN E . ELSE E + (9) E -> IF B THEN E ELSE E . (4) E -> E . AOP E (8) E -> E . SEMICOLON E - ELSE shift and go to state 60 + ! shift/reduce conflict for AOP resolved as shift + ! shift/reduce conflict for SEMICOLON resolved as shift + $end reduce using rule 9 (E -> IF B THEN E ELSE E .) + RPAREN reduce using rule 9 (E -> IF B THEN E ELSE E .) + EQOP reduce using rule 9 (E -> IF B THEN E ELSE E .) + COMP reduce using rule 9 (E -> IF B THEN E ELSE E .) + COMMA reduce using rule 9 (E -> IF B THEN E ELSE E .) + ELSE reduce using rule 9 (E -> IF B THEN E ELSE E .) + THEN reduce using rule 9 (E -> IF B THEN E ELSE E .) + LOP reduce using rule 9 (E -> IF B THEN E ELSE E .) + DO reduce using rule 9 (E -> IF B THEN E ELSE E .) + RBRACE reduce using rule 9 (E -> IF B THEN E ELSE E .) AOP shift and go to state 8 SEMICOLON shift and go to state 9 + ! AOP [ reduce using rule 9 (E -> IF B THEN E ELSE E .) ] + ! SEMICOLON [ reduce using rule 9 (E -> IF B THEN E ELSE E .) ] + state 58 - (10) E -> WHILE LPAREN B RPAREN DO LBRACE . E RBRACE - (1) E -> . LET D IN E - (2) E -> . ID - (3) E -> . ID LPAREN A RPAREN - (4) E -> . E AOP E - (5) E -> . LPAREN E RPAREN - (6) E -> . CONST - (7) E -> . ID ASSIGN E - (8) E -> . E SEMICOLON E - (9) E -> . IF LPAREN B RPAREN THEN E ELSE E - (10) E -> . WHILE LPAREN B RPAREN DO LBRACE E RBRACE + (10) E -> WHILE B DO LBRACE E RBRACE . - LET shift and go to state 2 - ID shift and go to state 3 - LPAREN shift and go to state 4 - CONST shift and go to state 5 - IF shift and go to state 6 - WHILE shift and go to state 7 + AOP reduce using rule 10 (E -> WHILE B DO LBRACE E RBRACE .) + SEMICOLON reduce using rule 10 (E -> WHILE B DO LBRACE E RBRACE .) + $end reduce using rule 10 (E -> WHILE B DO LBRACE E RBRACE .) + RPAREN reduce using rule 10 (E -> WHILE B DO LBRACE E RBRACE .) + EQOP reduce using rule 10 (E -> WHILE B DO LBRACE E RBRACE .) + COMP reduce using rule 10 (E -> WHILE B DO LBRACE E RBRACE .) + COMMA reduce using rule 10 (E -> WHILE B DO LBRACE E RBRACE .) + ELSE reduce using rule 10 (E -> WHILE B DO LBRACE E RBRACE .) + THEN reduce using rule 10 (E -> WHILE B DO LBRACE E RBRACE .) + LOP reduce using rule 10 (E -> WHILE B DO LBRACE E RBRACE .) + DO reduce using rule 10 (E -> WHILE B DO LBRACE E RBRACE .) + RBRACE reduce using rule 10 (E -> WHILE B DO LBRACE E RBRACE .) - E shift and go to state 61 state 59 @@ -1032,102 +1111,29 @@ state 59 (4) E -> E . AOP E (8) E -> E . SEMICOLON E - RBRACE shift and go to state 62 + RBRACE shift and go to state 60 AOP shift and go to state 8 SEMICOLON shift and go to state 9 state 60 - (9) E -> IF LPAREN B RPAREN THEN E ELSE . E - (1) E -> . LET D IN E - (2) E -> . ID - (3) E -> . ID LPAREN A RPAREN - (4) E -> . E AOP E - (5) E -> . LPAREN E RPAREN - (6) E -> . CONST - (7) E -> . ID ASSIGN E - (8) E -> . E SEMICOLON E - (9) E -> . IF LPAREN B RPAREN THEN E ELSE E - (10) E -> . WHILE LPAREN B RPAREN DO LBRACE E RBRACE - - LET shift and go to state 2 - ID shift and go to state 3 - LPAREN shift and go to state 4 - CONST shift and go to state 5 - IF shift and go to state 6 - WHILE shift and go to state 7 - - E shift and go to state 63 - -state 61 - - (10) E -> WHILE LPAREN B RPAREN DO LBRACE E . RBRACE - (4) E -> E . AOP E - (8) E -> E . SEMICOLON E - - RBRACE shift and go to state 64 - AOP shift and go to state 8 - SEMICOLON shift and go to state 9 - - -state 62 - (13) D -> ID LPAREN V RPAREN LBRACE E RBRACE . IN reduce using rule 13 (D -> ID LPAREN V RPAREN LBRACE E RBRACE .) ID reduce using rule 13 (D -> ID LPAREN V RPAREN LBRACE E RBRACE .) - -state 63 - - (9) E -> IF LPAREN B RPAREN THEN E ELSE E . - (4) E -> E . AOP E - (8) E -> E . SEMICOLON E - - ! shift/reduce conflict for AOP resolved as shift - ! shift/reduce conflict for SEMICOLON resolved as shift - $end reduce using rule 9 (E -> IF LPAREN B RPAREN THEN E ELSE E .) - RPAREN reduce using rule 9 (E -> IF LPAREN B RPAREN THEN E ELSE E .) - COMMA reduce using rule 9 (E -> IF LPAREN B RPAREN THEN E ELSE E .) - EQOP reduce using rule 9 (E -> IF LPAREN B RPAREN THEN E ELSE E .) - COMP reduce using rule 9 (E -> IF LPAREN B RPAREN THEN E ELSE E .) - LOP reduce using rule 9 (E -> IF LPAREN B RPAREN THEN E ELSE E .) - ELSE reduce using rule 9 (E -> IF LPAREN B RPAREN THEN E ELSE E .) - RBRACE reduce using rule 9 (E -> IF LPAREN B RPAREN THEN E ELSE E .) - AOP shift and go to state 8 - SEMICOLON shift and go to state 9 - - ! AOP [ reduce using rule 9 (E -> IF LPAREN B RPAREN THEN E ELSE E .) ] - ! SEMICOLON [ reduce using rule 9 (E -> IF LPAREN B RPAREN THEN E ELSE E .) ] - - -state 64 - - (10) E -> WHILE LPAREN B RPAREN DO LBRACE E RBRACE . - - AOP reduce using rule 10 (E -> WHILE LPAREN B RPAREN DO LBRACE E RBRACE .) - SEMICOLON reduce using rule 10 (E -> WHILE LPAREN B RPAREN DO LBRACE E RBRACE .) - $end reduce using rule 10 (E -> WHILE LPAREN B RPAREN DO LBRACE E RBRACE .) - RPAREN reduce using rule 10 (E -> WHILE LPAREN B RPAREN DO LBRACE E RBRACE .) - COMMA reduce using rule 10 (E -> WHILE LPAREN B RPAREN DO LBRACE E RBRACE .) - EQOP reduce using rule 10 (E -> WHILE LPAREN B RPAREN DO LBRACE E RBRACE .) - COMP reduce using rule 10 (E -> WHILE LPAREN B RPAREN DO LBRACE E RBRACE .) - LOP reduce using rule 10 (E -> WHILE LPAREN B RPAREN DO LBRACE E RBRACE .) - ELSE reduce using rule 10 (E -> WHILE LPAREN B RPAREN DO LBRACE E RBRACE .) - RBRACE reduce using rule 10 (E -> WHILE LPAREN B RPAREN DO LBRACE E RBRACE .) - WARNING: WARNING: Conflicts: WARNING: -WARNING: shift/reduce conflict for AOP in state 18 resolved as shift -WARNING: shift/reduce conflict for SEMICOLON in state 18 resolved as shift -WARNING: shift/reduce conflict for ID in state 19 resolved as shift -WARNING: shift/reduce conflict for AOP in state 24 resolved as shift -WARNING: shift/reduce conflict for SEMICOLON in state 24 resolved as shift -WARNING: shift/reduce conflict for AOP in state 32 resolved as shift -WARNING: shift/reduce conflict for SEMICOLON in state 32 resolved as shift -WARNING: shift/reduce conflict for EQOP in state 51 resolved as shift -WARNING: shift/reduce conflict for LOP in state 51 resolved as shift -WARNING: shift/reduce conflict for AOP in state 63 resolved as shift -WARNING: shift/reduce conflict for SEMICOLON in state 63 resolved as shift +WARNING: shift/reduce conflict for AOP in state 22 resolved as shift +WARNING: shift/reduce conflict for SEMICOLON in state 22 resolved as shift +WARNING: shift/reduce conflict for ID in state 23 resolved as shift +WARNING: shift/reduce conflict for AOP in state 28 resolved as shift +WARNING: shift/reduce conflict for SEMICOLON in state 28 resolved as shift +WARNING: shift/reduce conflict for AOP in state 38 resolved as shift +WARNING: shift/reduce conflict for SEMICOLON in state 38 resolved as shift +WARNING: shift/reduce conflict for EQOP in state 45 resolved as shift +WARNING: shift/reduce conflict for LOP in state 45 resolved as shift +WARNING: shift/reduce conflict for AOP in state 57 resolved as shift +WARNING: shift/reduce conflict for SEMICOLON in state 57 resolved as shift diff --git a/Project-02/parsetab.py b/Project-02/parsetab.py index 5bd8b35..e42ff9c 100644 --- a/Project-02/parsetab.py +++ b/Project-02/parsetab.py @@ -6,9 +6,9 @@ _tabversion = '3.10' _lr_method = 'LALR' -_lr_signature = 'EleftCOMPleftEQOPleftAOPAOP ASSIGN COMMA COMP CONST DO ELSE EQOP FALSE ID IF IN LBRACE LET LOP LPAREN RBRACE RPAREN SEMICOLON THEN TRUE WHILEE : LET D IN EE : IDE : ID LPAREN A RPARENE : E AOP EE : LPAREN E RPARENE : CONSTE : ID ASSIGN EE : E SEMICOLON EE : IF LPAREN B RPAREN THEN E ELSE EE : WHILE LPAREN B RPAREN DO LBRACE E RBRACEA : EA : A COMMA ED : ID LPAREN V RPAREN LBRACE E RBRACED : D DV : IDV : V COMMA IDB : E EQOP EB : E COMP EB : B EQOP BB : B LOP BB : TRUEB : FALSEB : LPAREN B RPAREN' +_lr_signature = 'EleftCOMPleftEQOPleftAOPAOP ASSIGN COMMA COMP CONST DO ELSE EQOP FALSE ID IF IN LBRACE LET LOP LPAREN RBRACE RPAREN SEMICOLON THEN TRUE WHILEE : LET D IN EE : IDE : ID LPAREN A RPARENE : E AOP EE : LPAREN E RPARENE : CONSTE : ID ASSIGN EE : E SEMICOLON EE : IF B THEN E ELSE EE : WHILE B DO LBRACE E RBRACEA : EA : A COMMA ED : ID LPAREN V RPAREN LBRACE E RBRACED : D DV : IDV : V COMMA IDB : E EQOP EB : E COMP EB : B EQOP BB : B LOP BB : TRUEB : FALSEB : LPAREN B RPAREN' -_lr_action_items = {'LET':([0,4,8,9,12,13,15,16,20,26,36,40,41,42,43,49,55,58,60,],[2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,]),'ID':([0,2,4,8,9,10,12,13,15,16,19,20,21,26,36,40,41,42,43,46,49,55,58,60,62,],[3,11,3,3,3,11,3,3,3,3,11,3,33,3,3,3,3,3,3,56,3,3,3,3,-13,]),'LPAREN':([0,3,4,6,7,8,9,11,12,13,15,16,20,26,36,40,41,42,43,49,55,58,60,],[4,12,4,15,16,4,4,21,4,4,26,26,4,26,4,26,26,4,4,4,4,4,4,]),'CONST':([0,4,8,9,12,13,15,16,20,26,36,40,41,42,43,49,55,58,60,],[5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,]),'IF':([0,4,8,9,12,13,15,16,20,26,36,40,41,42,43,49,55,58,60,],[6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,]),'WHILE':([0,4,8,9,12,13,15,16,20,26,36,40,41,42,43,49,55,58,60,],[7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,]),'$end':([1,3,5,17,18,24,25,32,35,63,64,],[0,-2,-6,-4,-8,-7,-5,-1,-3,-9,-10,]),'AOP':([1,3,5,14,17,18,23,24,25,28,32,35,38,47,52,53,57,59,61,63,64,],[8,-2,-6,8,-4,8,8,8,-5,8,8,-3,8,8,8,8,8,8,8,8,-10,]),'SEMICOLON':([1,3,5,14,17,18,23,24,25,28,32,35,38,47,52,53,57,59,61,63,64,],[9,-2,-6,9,-4,9,9,9,-5,9,9,-3,9,9,9,9,9,9,9,9,-10,]),'RPAREN':([3,5,14,17,18,22,23,24,25,27,29,30,31,32,33,34,35,37,38,47,48,50,51,52,53,56,63,64,],[-2,-6,25,-4,-8,35,-11,-7,-5,39,-21,-22,44,-1,-15,45,-3,48,25,-12,-23,-19,-20,-17,-18,-16,-9,-10,]),'COMMA':([3,5,17,18,22,23,24,25,32,33,34,35,47,56,63,64,],[-2,-6,-4,-8,36,-11,-7,-5,-1,-15,46,-3,-12,-16,-9,-10,]),'EQOP':([3,5,17,18,24,25,27,28,29,30,31,32,35,37,38,48,50,51,52,53,63,64,],[-2,-6,-4,-8,-7,-5,40,42,-21,-22,40,-1,-3,40,42,-23,-19,40,-17,-18,-9,-10,]),'COMP':([3,5,17,18,24,25,28,32,35,38,63,64,],[-2,-6,-4,-8,-7,-5,43,-1,-3,43,-9,-10,]),'LOP':([3,5,17,18,24,25,27,29,30,31,32,35,37,48,50,51,52,53,63,64,],[-2,-6,-4,-8,-7,-5,41,-21,-22,41,-1,-3,41,-23,-19,41,-17,-18,-9,-10,]),'ELSE':([3,5,17,18,24,25,32,35,57,63,64,],[-2,-6,-4,-8,-7,-5,-1,-3,60,-9,-10,]),'RBRACE':([3,5,17,18,24,25,32,35,59,61,63,64,],[-2,-6,-4,-8,-7,-5,-1,-3,62,64,-9,-10,]),'ASSIGN':([3,],[13,]),'IN':([10,19,62,],[20,-14,-13,]),'TRUE':([15,16,26,40,41,],[29,29,29,29,29,]),'FALSE':([15,16,26,40,41,],[30,30,30,30,30,]),'THEN':([39,],[49,]),'DO':([44,],[54,]),'LBRACE':([45,54,],[55,58,]),} +_lr_action_items = {'LET':([0,4,6,7,8,9,12,13,19,24,30,31,32,33,34,42,49,53,55,],[2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,]),'ID':([0,2,4,6,7,8,9,10,12,13,19,23,24,25,30,31,32,33,34,42,49,51,53,55,60,],[3,11,3,3,3,3,3,11,3,3,3,11,3,39,3,3,3,3,3,3,3,56,3,3,-13,]),'LPAREN':([0,3,4,6,7,8,9,11,12,13,19,24,30,31,32,33,34,42,49,53,55,],[4,12,4,19,19,4,4,25,4,4,19,4,4,19,19,4,4,4,4,4,4,]),'CONST':([0,4,6,7,8,9,12,13,19,24,30,31,32,33,34,42,49,53,55,],[5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,]),'IF':([0,4,6,7,8,9,12,13,19,24,30,31,32,33,34,42,49,53,55,],[6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,]),'WHILE':([0,4,6,7,8,9,12,13,19,24,30,31,32,33,34,42,49,53,55,],[7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,]),'$end':([1,3,5,21,22,28,29,38,41,57,58,],[0,-2,-6,-4,-8,-7,-5,-1,-3,-9,-10,]),'AOP':([1,3,5,14,16,21,22,27,28,29,36,38,41,43,46,47,52,54,57,58,59,],[8,-2,-6,8,8,-4,8,8,8,-5,8,8,-3,8,8,8,8,8,8,-10,8,]),'SEMICOLON':([1,3,5,14,16,21,22,27,28,29,36,38,41,43,46,47,52,54,57,58,59,],[9,-2,-6,9,9,-4,9,9,9,-5,9,9,-3,9,9,9,9,9,9,-10,9,]),'RPAREN':([3,5,14,17,18,21,22,26,27,28,29,35,36,38,39,40,41,44,45,46,47,48,52,56,57,58,],[-2,-6,29,-21,-22,-4,-8,41,-11,-7,-5,48,29,-1,-15,50,-3,-19,-20,-17,-18,-23,-12,-16,-9,-10,]),'EQOP':([3,5,15,16,17,18,20,21,22,28,29,35,36,38,41,44,45,46,47,48,57,58,],[-2,-6,31,33,-21,-22,31,-4,-8,-7,-5,31,33,-1,-3,-19,31,-17,-18,-23,-9,-10,]),'COMP':([3,5,16,21,22,28,29,36,38,41,57,58,],[-2,-6,34,-4,-8,-7,-5,34,-1,-3,-9,-10,]),'COMMA':([3,5,21,22,26,27,28,29,38,39,40,41,52,56,57,58,],[-2,-6,-4,-8,42,-11,-7,-5,-1,-15,51,-3,-12,-16,-9,-10,]),'ELSE':([3,5,21,22,28,29,38,41,43,57,58,],[-2,-6,-4,-8,-7,-5,-1,-3,53,-9,-10,]),'THEN':([3,5,15,17,18,21,22,28,29,38,41,44,45,46,47,48,57,58,],[-2,-6,30,-21,-22,-4,-8,-7,-5,-1,-3,-19,-20,-17,-18,-23,-9,-10,]),'LOP':([3,5,15,17,18,20,21,22,28,29,35,38,41,44,45,46,47,48,57,58,],[-2,-6,32,-21,-22,32,-4,-8,-7,-5,32,-1,-3,-19,32,-17,-18,-23,-9,-10,]),'DO':([3,5,17,18,20,21,22,28,29,38,41,44,45,46,47,48,57,58,],[-2,-6,-21,-22,37,-4,-8,-7,-5,-1,-3,-19,-20,-17,-18,-23,-9,-10,]),'RBRACE':([3,5,21,22,28,29,38,41,54,57,58,59,],[-2,-6,-4,-8,-7,-5,-1,-3,58,-9,-10,60,]),'ASSIGN':([3,],[13,]),'TRUE':([6,7,19,31,32,],[17,17,17,17,17,]),'FALSE':([6,7,19,31,32,],[18,18,18,18,18,]),'IN':([10,23,60,],[24,-14,-13,]),'LBRACE':([37,50,],[49,55,]),} _lr_action = {} for _k, _v in _lr_action_items.items(): @@ -17,7 +17,7 @@ for _k, _v in _lr_action_items.items(): _lr_action[_x][_k] = _y del _lr_action_items -_lr_goto_items = {'E':([0,4,8,9,12,13,15,16,20,26,36,40,41,42,43,49,55,58,60,],[1,14,17,18,23,24,28,28,32,38,47,28,28,52,53,57,59,61,63,]),'D':([2,10,19,],[10,19,19,]),'A':([12,],[22,]),'B':([15,16,26,40,41,],[27,31,37,50,51,]),'V':([21,],[34,]),} +_lr_goto_items = {'E':([0,4,6,7,8,9,12,13,19,24,30,31,32,33,34,42,49,53,55,],[1,14,16,16,21,22,27,28,36,38,43,16,16,46,47,52,54,57,59,]),'D':([2,10,23,],[10,23,23,]),'B':([6,7,19,31,32,],[15,20,35,44,45,]),'A':([12,],[26,]),'V':([25,],[40,]),} _lr_goto = {} for _k, _v in _lr_goto_items.items(): @@ -35,19 +35,19 @@ _lr_productions = [ ('E -> CONST','E',1,'p_E_const','triplayacc.py',45), ('E -> ID ASSIGN E','E',3,'p_E_assign','triplayacc.py',49), ('E -> E SEMICOLON E','E',3,'p_E_seq','triplayacc.py',53), - ('E -> IF LPAREN B RPAREN THEN E ELSE E','E',8,'p_E_if','triplayacc.py',57), - ('E -> WHILE LPAREN B RPAREN DO LBRACE E RBRACE','E',8,'p_E_while','triplayacc.py',61), - ('A -> E','A',1,'p_A_single','triplayacc.py',69), - ('A -> A COMMA E','A',3,'p_A_multiple','triplayacc.py',73), - ('D -> ID LPAREN V RPAREN LBRACE E RBRACE','D',7,'p_D_single','triplayacc.py',81), - ('D -> D D','D',2,'p_D_concat','triplayacc.py',85), - ('V -> ID','V',1,'p_V_single','triplayacc.py',93), - ('V -> V COMMA ID','V',3,'p_V_multiple','triplayacc.py',97), - ('B -> E EQOP E','B',3,'p_B_eqop_E','triplayacc.py',105), - ('B -> E COMP E','B',3,'p_B_comp','triplayacc.py',109), - ('B -> B EQOP B','B',3,'p_B_eqop_B','triplayacc.py',113), - ('B -> B LOP B','B',3,'p_B_lop','triplayacc.py',117), - ('B -> TRUE','B',1,'p_B_true','triplayacc.py',121), - ('B -> FALSE','B',1,'p_B_false','triplayacc.py',125), - ('B -> LPAREN B RPAREN','B',3,'p_B_paren','triplayacc.py',129), + ('E -> IF B THEN E ELSE E','E',6,'p_E_if','triplayacc.py',57), + ('E -> WHILE B DO LBRACE E RBRACE','E',6,'p_E_while','triplayacc.py',61), + ('A -> E','A',1,'p_A_single','triplayacc.py',70), + ('A -> A COMMA E','A',3,'p_A_multiple','triplayacc.py',74), + ('D -> ID LPAREN V RPAREN LBRACE E RBRACE','D',7,'p_D_single','triplayacc.py',82), + ('D -> D D','D',2,'p_D_concat','triplayacc.py',86), + ('V -> ID','V',1,'p_V_single','triplayacc.py',94), + ('V -> V COMMA ID','V',3,'p_V_multiple','triplayacc.py',98), + ('B -> E EQOP E','B',3,'p_B_eqop_E','triplayacc.py',106), + ('B -> E COMP E','B',3,'p_B_comp','triplayacc.py',110), + ('B -> B EQOP B','B',3,'p_B_eqop_B','triplayacc.py',114), + ('B -> B LOP B','B',3,'p_B_lop','triplayacc.py',118), + ('B -> TRUE','B',1,'p_B_true','triplayacc.py',122), + ('B -> FALSE','B',1,'p_B_false','triplayacc.py',126), + ('B -> LPAREN B RPAREN','B',3,'p_B_paren','triplayacc.py',130), ] diff --git a/Project-02/triplalex.py b/Project-02/triplalex.py index c581772..b7c463d 100644 --- a/Project-02/triplalex.py +++ b/Project-02/triplalex.py @@ -72,11 +72,17 @@ def t_newline(t): # Ignore whitespace t_ignore = ' \t' -# Comments -def t_comment(t): +# Single-line comment +def t_comment_single(t): r'//.*' pass +# Multi-line comment +def t_comment_multi(t): + r'/\*([^*]|\*+[^*/])*\*/' + t.lexer.lineno += t.value.count('\n') + pass + # Error handling def t_error(t): print("Illegal character '%s'" % t.value[0]) diff --git a/Project-02/triplaprograms/func.tripla b/Project-02/triplaprograms/func.tripla index 643f804..9e531ae 100644 --- a/Project-02/triplaprograms/func.tripla +++ b/Project-02/triplaprograms/func.tripla @@ -1,7 +1,7 @@ let func(a,b) { - do { + while ( a > 0 && b != a ) do { b = b + 1; a = a - 1 - } while ( a > 0 && b != a ) + } } in func(10, 8) \ No newline at end of file diff --git a/Project-02/triplayacc.py b/Project-02/triplayacc.py index 650a2ff..62ea53f 100644 --- a/Project-02/triplayacc.py +++ b/Project-02/triplayacc.py @@ -54,12 +54,13 @@ def p_E_seq(p): p[0] = ast.SEQ(p[1], p[3]) def p_E_if(p): - 'E : IF LPAREN B RPAREN THEN E ELSE E' - p[0] = ast.IF(p[3], p[6], p[8]) + 'E : IF B THEN E ELSE E' + p[0] = ast.IF(p[2], p[4], p[6]) def p_E_while(p): - 'E : WHILE LPAREN B RPAREN DO LBRACE E RBRACE' - p[0] = ast.WHILE(p[3], p[7]) + 'E : WHILE B DO LBRACE E RBRACE' + p[0] = ast.WHILE(p[2], p[5]) + # ------------------------------------------------------------ # Rules for A