added div and mul
This commit is contained in:
@@ -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"
|
||||||
|
20
src/parse.ml
20
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.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"
|
||||||
|
|
||||||
|
@@ -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
|
||||||
|
Reference in New Issue
Block a user