added div and mul

This commit is contained in:
2017-05-30 09:32:11 -04:00
parent 53f66f6edc
commit 8e59440ef7
3 changed files with 67 additions and 0 deletions

View File

@@ -115,6 +115,11 @@ let generate_add s g d id1 id2 =
let vi = token_var s g v in let vi = token_var s g v in
let _ = generate_copy s g v id1 in let _ = generate_copy s g v id1 in
let _ = binop g "add " vi (string_of_int l2) in v 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" | _ -> Token.syntax_error s "generate exp called with invalid argument"
let generate_sub s g d id1 id2 = 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 _ = generate_copy s g v id1 in
let _ = binop g "sub " vi (var s g i2) in v let _ = binop g "sub " vi (var s g i2) in v
| _ -> Token.syntax_error s "generate exp called with invalid argument" | _ -> 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"

View File

@@ -12,6 +12,20 @@ let sub s g d l r =
| (Token.Literal _, Token.Identifier _) -> Codegen.generate_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" | _ -> 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 rec expression s g d =
let primary s = let primary s =
match Token.next_token s with match Token.next_token s with
@@ -39,6 +53,12 @@ let rec expression s g d =
| Token.Sub -> | Token.Sub ->
let _ = Token.match_token s Sub in let _ = Token.match_token s Sub in
sub s g d l (expression s g (d+1)) 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) | _ -> l)
| None -> Token.syntax_error s "literal or identifier expected" | None -> Token.syntax_error s "literal or identifier expected"

View File

@@ -9,6 +9,8 @@ type token = Begin
| RightParen | RightParen
| Add | Add
| Sub | Sub
| Mul
| Div
| Comma | Comma
| Semicolon | Semicolon
@@ -51,6 +53,8 @@ let scan s =
else if Charstream.is_digit c then scan_lit (Char.escaped c) else if Charstream.is_digit c then scan_lit (Char.escaped c)
else if c='+' then Add else if c='+' then Add
else if c='-' then Sub else if c='-' then Sub
else if c='*' then Mul
else if c='/' then Div
else if c=',' then Comma else if c=',' then Comma
else if c=';' then Semicolon else if c=';' then Semicolon
else if c='(' then LeftParen else if c='(' then LeftParen