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 _ = 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"
|
||||
|
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.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"
|
||||
|
||||
|
@@ -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
|
||||
|
Reference in New Issue
Block a user