Prechádzať zdrojové kódy

directly handle unary neg on int/float constants at parser-level

Nicolas Cannasse 14 rokov pred
rodič
commit
dd71e33080
3 zmenil súbory, kde vykonal 9 pridanie a 11 odobranie
  1. 0 6
      codegen.ml
  2. 8 1
      parser.ml
  3. 1 4
      typer.ml

+ 0 - 6
codegen.ml

@@ -306,12 +306,6 @@ let build_metadata com t =
 			mk (TObjectDecl (List.map (fun (n,e) -> n, loop e) el)) (TAnon { a_fields = PMap.empty; a_status = ref Closed }) p
 		| EArrayDecl el ->
 			mk (TArrayDecl (List.map loop el)) (com.basic.tarray t_dynamic) p
-		| EUnop (Neg, Prefix, e) ->
-			let e = loop e in
-			(match e.eexpr with
-			| TConst (TInt i) -> { e with eexpr = TConst (TInt (Int32.neg i)) }
-			| TConst (TFloat f) -> { e with eexpr = TConst (TFloat ("-" ^ f)) }
-			| _ -> error "Metadata should be constant" p)
 		| _ ->
 			error "Metadata should be constant" p
 	in

+ 8 - 1
parser.ml

@@ -549,7 +549,14 @@ and expr = parser
 		with
 			Display e -> display (make e))
 	| [< '(Unop op,p1) when is_prefix op; e = expr >] -> make_unop op e p1
-	| [< '(Binop OpSub,p1); e = expr >] -> make_unop Neg e p1
+	| [< '(Binop OpSub,p1); e = expr >] -> 
+		let neg s =
+			if s.[0] = '-' then String.sub s 1 (String.length s - 1) else "-" ^ s
+		in
+		(match make_unop Neg e p1 with
+		| EUnop (Neg,Prefix,(EConst (Int i),pc)),p -> EConst (Int (neg i)),p
+		| EUnop (Neg,Prefix,(EConst (Float j),pc)),p -> EConst (Float (neg j)),p
+		| e -> e)
 	| [< '(Binop OpAdd,p1); e = expr >] -> e
 	| [< '(Kwd For,p); '(POpen,_); name = any_ident; '(Kwd In,_); it = expr; '(PClose,_); s >] ->
 		(try

+ 1 - 4
typer.ml

@@ -864,10 +864,7 @@ and type_unop ctx op flag e p =
 			| k ->
 				if unify_int ctx e k then ctx.t.tint else ctx.t.tfloat)
 		) in
-		match op, e.eexpr with
-		| Neg , TConst (TInt i) -> mk (TConst (TInt (Int32.neg i))) t p
-		| Neg , TConst (TFloat f) when f.[0] != '-' -> mk (TConst (TFloat ("-" ^ f))) t p
-		| _ -> mk (TUnop (op,flag,e)) t p
+		mk (TUnop (op,flag,e)) t p
 	in
 	match acc with
 	| AKExpr e -> access e