|
|
@@ -1,11 +1,11 @@
|
|
|
MODULE cradle9;
|
|
|
|
|
|
-(* Part 3 *)
|
|
|
-(* variables and numbers with mutiples digits *)
|
|
|
+(* Part 3 *)
|
|
|
+(* variables and numbers with mutiples digits *)
|
|
|
|
|
|
-(* <factor> ::= [+|-]digit | (<expression>) *)
|
|
|
-(* <expression> ::= <term> [<addop> <term>]* *)
|
|
|
-(* <term> ::= <factor> [ <mulop> <factor ]* *)
|
|
|
+(* <factor> ::= [+|-]digit | (<expression>) | <variable> *)
|
|
|
+(* <expression> ::= <term> [<addop> <term>]* *)
|
|
|
+(* <term> ::= <factor> [ <mulop> <factor ]* *)
|
|
|
|
|
|
IMPORT SYSTEM, Strings, InOut,WholeStr, CharClass, FIO ;
|
|
|
|
|
|
@@ -123,10 +123,10 @@ END EmitLn;
|
|
|
(* le parser commence ici *********************)
|
|
|
(******************************************************)
|
|
|
|
|
|
-(* <factor> ::= [+|-]digit | (<expression>) *)
|
|
|
-(* <expression> ::= <term> [<addop> <term>]* *)
|
|
|
-(* <term> ::= <factor> [ <mulop> <factor ]* *)
|
|
|
-(* adding unary sign, + and - *)
|
|
|
+(* <factor> ::= [+|-]digit | (<expression>) | <variable> *)
|
|
|
+(* <expression> ::= <term> [<addop> <term>]* *)
|
|
|
+(* <term> ::= <factor> [ <mulop> <factor ]* *)
|
|
|
+(* adding unary sign, + and - *)
|
|
|
|
|
|
PROCEDURE Expression; FORWARD;
|
|
|
|
|
|
@@ -143,14 +143,17 @@ BEGIN
|
|
|
Match('(');
|
|
|
Expression;
|
|
|
Match(')');
|
|
|
- ELSE
|
|
|
+ ELSIF IsAlpha(Look) THEN
|
|
|
+ (*EmitLn('MOVE ' + GetName + '(PC),D0')*)
|
|
|
+
|
|
|
+ ELSE
|
|
|
(* digit *)
|
|
|
(* EmitLn('MOVE #' + GetNum + ',D0')*)
|
|
|
GetNum(c);
|
|
|
Strings.Concat(TAB,"mov rax,", chaine);
|
|
|
Strings.Concat(chaine, Strings.String1(c), chaine);
|
|
|
EmitLn(chaine)
|
|
|
- END
|
|
|
+ END
|
|
|
END Factor;
|
|
|
|
|
|
|
|
|
@@ -163,7 +166,7 @@ BEGIN
|
|
|
(*EmitLn('MULS (SP)+,D0');*)
|
|
|
Strings.Concat(TAB,"pop rbx", chaine);
|
|
|
EmitLn(chaine);
|
|
|
- Strings.Concat(TAB,"imul rax, rbx", chaine);
|
|
|
+ Strings.Concat(TAB,"mul rbx", chaine);
|
|
|
EmitLn(chaine);
|
|
|
END Multiply;
|
|
|
|
|
|
@@ -178,7 +181,7 @@ BEGIN
|
|
|
(*EmitLn('DIVS D1,D0');*)
|
|
|
Strings.Concat(TAB,"pop rbx", chaine);
|
|
|
EmitLn(chaine);
|
|
|
- Strings.Concat(TAB,"div rax, rbx", chaine);
|
|
|
+ Strings.Concat(TAB,"div rbx", chaine);
|
|
|
EmitLn(chaine);
|
|
|
END Divide;
|
|
|
|
|
|
@@ -298,7 +301,8 @@ PROCEDURE EndCompile;
|
|
|
BEGIN
|
|
|
EmitLn("");
|
|
|
EmitLn("; end of program");
|
|
|
- Strings.Concat(TAB, "mov rdi,0",chaine);
|
|
|
+ (* on met le résultat dans rax, puis transfert and rdi pour avoir le code de sortie *)
|
|
|
+ Strings.Concat(TAB, "mov rdi, rax", chaine);
|
|
|
EmitLn(chaine);
|
|
|
Strings.Concat(TAB, "mov rax,SYS_EXIT",chaine);
|
|
|
EmitLn(chaine);
|