瀏覽代碼

language: add LFLOAT builtin

Eric Streit 13 小時之前
父節點
當前提交
5ae8152b63
共有 4 個文件被更改,包括 17 次插入 和 8 次删除
  1. 1 0
      compiler/run_tests.sh
  2. 2 2
      compiler/src/M2.atg
  3. 6 6
      compiler/src/M2.lst
  4. 8 0
      compiler/tests/t_lfloat.mod

+ 1 - 0
compiler/run_tests.sh

@@ -65,6 +65,7 @@ expect_run t_bareproc.mod 42
 expect_run t_variantext.mod 42
 expect_run t_bool.mod 42
 expect_run t_real.mod 31
+expect_run t_lfloat.mod 42
 expect_run t_array.mod 108
 expect_run t_multidim.mod 42
 expect_run t_multidim_local.mod 42

+ 2 - 2
compiler/src/M2.atg

@@ -1329,7 +1329,7 @@ PRODUCTIONS
                                            END; .)
     | ( "TSIZE" | "SIZE" | "ADR" | "HIGH" | "LEN"
       | "CHR" | "ORD" | "VAL" | "ABS" | "CAP"
-      | "ODD" | "TRUNC" | "FLOAT"
+      | "ODD" | "TRUNC" | "FLOAT" | "LFLOAT"
       | "UCHR" | "CHR8" | "UORD"
       | "INC" | "DEC"
       | "SHIFT" | "ROTATE" | "CAST" | "CONVERT" | "MIN" | "MAX"
@@ -4310,7 +4310,7 @@ PRODUCTIONS
    astCur := astNode; astIsLit := TRUE; .)
                                         (. t := SymTab.IntType();
                                            QbeGen.CopyOp("@", q); .)
-    | "FLOAT" "(" Expr<et, q> ")"
+    | ( "FLOAT" | "LFLOAT" ) "(" Expr<et, q> ")"
     (. (* FLOAT(i): integer -> REAL, as the VAL builtin *)
    astNode := AST.MakeNode(AST.NkCall);
    AST.SetChild(astNode, 0, AST.MakeLeaf(AST.NkIdent, "VAL"));

+ 6 - 6
compiler/src/M2.lst

@@ -1353,7 +1353,7 @@ Listing:
  1329                                             END; .)
  1330      | ( "TSIZE" | "SIZE" | "ADR" | "HIGH" | "LEN"
  1331        | "CHR" | "ORD" | "VAL" | "ABS" | "CAP"
- 1332        | "ODD" | "TRUNC" | "FLOAT"
+ 1332        | "ODD" | "TRUNC" | "FLOAT" | "LFLOAT"
  1333        | "UCHR" | "CHR8" | "UORD"
  1334        | "INC" | "DEC"
  1335        | "SHIFT" | "ROTATE" | "CAST" | "CONVERT" | "MIN" | "MAX"
@@ -4334,7 +4334,7 @@ Listing:
  4310     astCur := astNode; astIsLit := TRUE; .)
  4311                                          (. t := SymTab.IntType();
  4312                                             QbeGen.CopyOp("@", q); .)
- 4313      | "FLOAT" "(" Expr<et, q> ")"
+ 4313      | ( "FLOAT" | "LFLOAT" ) "(" Expr<et, q> ")"
  4314      (. (* FLOAT(i): integer -> REAL, as the VAL builtin *)
  4315     astNode := AST.MakeNode(AST.NkCall);
  4316     AST.SetChild(astNode, 0, AST.MakeLeaf(AST.NkIdent, "VAL"));
@@ -4691,11 +4691,11 @@ Listing:
 
 Statistics:
 
-  nr of terminals:       122 (limit   400)
+  nr of terminals:       123 (limit   400)
   nr of non-terminals:    93 (limit   210)
-  nr of pragmas:           0 (limit   378)
-  nr of symbolnodes:     215 (limit   500)
-  nr of graphnodes:     1461 (limit  1500)
+  nr of pragmas:           0 (limit   377)
+  nr of symbolnodes:     216 (limit   500)
+  nr of graphnodes:     1466 (limit  1500)
   nr of conditionsets:    12 (limit   100)
   nr of charactersets:    17 (limit   250)
 

+ 8 - 0
compiler/tests/t_lfloat.mod

@@ -0,0 +1,8 @@
+MODULE TLFloat;
+(* ISO/gm2 LFLOAT: integer -> LONGREAL (V3 reals are 64-bit). *)
+VAR x : LONGREAL; n : CARDINAL; ExitCode : INTEGER;
+BEGIN
+  n := 42;
+  x := LFLOAT(n);
+  IF x = 42.0 THEN ExitCode := 42 ELSE ExitCode := 1 END
+END TLFloat.