From 8e59440ef7544cd4d498343a77db9fd16606266a Mon Sep 17 00:00:00 2001 From: hellerve Date: Tue, 30 May 2017 09:32:11 -0400 Subject: [PATCH] added div and mul --- src/codegen.ml | 43 +++++++++++++++++++++++++++++++++++++++++++ src/parse.ml | 20 ++++++++++++++++++++ src/token.ml | 4 ++++ 3 files changed, 67 insertions(+) diff --git a/src/codegen.ml b/src/codegen.ml index 881a332..9bf9d57 100644 --- a/src/codegen.ml +++ b/src/codegen.ml @@ -115,6 +115,11 @@ let generate_add s g d id1 id2 = let vi = token_var s g v in let _ = generate_copy s g v id1 in let _ = binop g "add " vi (string_of_int l2) in v + | (Token.Literal _, Token.Identifier i2) -> + let v = temp_var s g d in + let vi = token_var s g v in + let _ = generate_copy s g v id1 in + let _ = binop g "add " vi (var s g i2) in v | _ -> Token.syntax_error s "generate exp called with invalid argument" let generate_sub s g d id1 id2 = @@ -135,3 +140,41 @@ let generate_sub s g d id1 id2 = let _ = generate_copy s g v id1 in let _ = binop g "sub " vi (var s g i2) in v | _ -> Token.syntax_error s "generate exp called with invalid argument" + +let generate_mul s g d id1 id2 = + match (id1, id2) with + | (Token.Identifier _, Token.Identifier i2) -> + let v = temp_var s g d in + let vi = token_var s g v in + let _ = generate_copy s g v id1 in + let _ = binop g "mul " vi (var s g i2) in v + | (Token.Identifier _, Token.Literal l2) -> + let v = temp_var s g d in + let vi = token_var s g v in + let _ = generate_copy s g v id1 in + let _ = binop g "mul " vi (string_of_int l2) in v + | (Token.Literal _, Token.Identifier i2) -> + let v = temp_var s g d in + let vi = token_var s g v in + let _ = generate_copy s g v id1 in + let _ = binop g "mul " vi (var s g i2) in v + | _ -> Token.syntax_error s "generate exp called with invalid argument" + +let generate_div s g d id1 id2 = + match (id1, id2) with + | (Token.Identifier _, Token.Identifier i2) -> + let v = temp_var s g d in + let vi = token_var s g v in + let _ = generate_copy s g v id1 in + let _ = binop g "div " vi (var s g i2) in v + | (Token.Identifier _, Token.Literal l2) -> + let v = temp_var s g d in + let vi = token_var s g v in + let _ = generate_copy s g v id1 in + let _ = binop g "div " vi (string_of_int l2) in v + | (Token.Literal _, Token.Identifier i2) -> + let v = temp_var s g d in + let vi = token_var s g v in + let _ = generate_copy s g v id1 in + let _ = binop g "div " vi (var s g i2) in v + | _ -> Token.syntax_error s "generate exp called with invalid argument" diff --git a/src/parse.ml b/src/parse.ml index ecffb97..2724662 100644 --- a/src/parse.ml +++ b/src/parse.ml @@ -12,6 +12,20 @@ let sub s g d l r = | (Token.Literal _, Token.Identifier _) -> Codegen.generate_sub s g d l r | _ -> Token.syntax_error s "expected literal or identifier for sub operation" +let mul s g d l r = + match (l, r) with + | (Token.Literal l1,Token.Literal l2) ->Token.Literal (l1*l2) + | (Token.Identifier _, Token.Literal _) -> Codegen.generate_mul s g d l r + | (Token.Literal _, Token.Identifier _) -> Codegen.generate_mul s g d r l + | _ -> Token.syntax_error s "expected literal or identifier for mul operation" + +let div s g d l r = + match (l, r) with + | (Token.Literal l1,Token.Literal l2) ->Token.Literal (l1/l2) + | (Token.Identifier _, Token.Literal _) -> Codegen.generate_div s g d l r + | (Token.Literal _, Token.Identifier _) -> Codegen.generate_div s g d l r + | _ -> Token.syntax_error s "expected literal or identifier for div operation" + let rec expression s g d = let primary s = match Token.next_token s with @@ -39,6 +53,12 @@ let rec expression s g d = | Token.Sub -> let _ = Token.match_token s Sub in sub s g d l (expression s g (d+1)) + | Token.Mul -> + let _ = Token.match_token s Mul in + mul s g d l (expression s g (d+1)) + | Token.Div -> + let _ = Token.match_token s Div in + div s g d l (expression s g (d+1)) | _ -> l) | None -> Token.syntax_error s "literal or identifier expected" diff --git a/src/token.ml b/src/token.ml index 63b57a8..7f5f852 100644 --- a/src/token.ml +++ b/src/token.ml @@ -9,6 +9,8 @@ type token = Begin | RightParen | Add | Sub + | Mul + | Div | Comma | Semicolon @@ -51,6 +53,8 @@ let scan s = else if Charstream.is_digit c then scan_lit (Char.escaped c) else if c='+' then Add else if c='-' then Sub + else if c='*' then Mul + else if c='/' then Div else if c=',' then Comma else if c=';' then Semicolon else if c='(' then LeftParen