diff --git a/regression/test001.expr b/regression/test001.expr index a1361073c..b49c73b23 100644 --- a/regression/test001.expr +++ b/regression/test001.expr @@ -1,3 +1,3 @@ -global x = read (), y = read (), z = x * y * 3; +local x = read (), y = read (), z = x * y * 3; write (z) diff --git a/regression/test002.expr b/regression/test002.expr index 4343f3567..30524e637 100644 --- a/regression/test002.expr +++ b/regression/test002.expr @@ -1,4 +1,4 @@ -global x, y, z; +local x, y, z; x := read (); y := read (); diff --git a/regression/test003.expr b/regression/test003.expr index 9cac44ef0..0043a847c 100644 --- a/regression/test003.expr +++ b/regression/test003.expr @@ -1,4 +1,4 @@ -global x, y; +local x, y; x := read (); y := read (); diff --git a/regression/test004.expr b/regression/test004.expr index dde774752..8d62b2aa7 100644 --- a/regression/test004.expr +++ b/regression/test004.expr @@ -1,4 +1,4 @@ -global x, y, z; +local x, y, z; x := read (); y := read (); diff --git a/regression/test005.expr b/regression/test005.expr index 128ead80a..ffb4c7cf2 100644 --- a/regression/test005.expr +++ b/regression/test005.expr @@ -1,4 +1,4 @@ -global x, y, z; +local x, y, z; x := read (); y := read (); diff --git a/regression/test006.expr b/regression/test006.expr index 99de2c6e0..7774f922c 100644 --- a/regression/test006.expr +++ b/regression/test006.expr @@ -1,4 +1,4 @@ -global x, y, z; +local x, y, z; x := read (); y := read (); diff --git a/regression/test007.expr b/regression/test007.expr index 3ea167ce5..ac4c24a4e 100644 --- a/regression/test007.expr +++ b/regression/test007.expr @@ -1,4 +1,4 @@ -global x, y, z; +local x, y, z; x := 1; y := 2; diff --git a/regression/test008.expr b/regression/test008.expr index 9394c421b..d4aed6991 100644 --- a/regression/test008.expr +++ b/regression/test008.expr @@ -1,4 +1,4 @@ -global z; +local z; z := 0 - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9; write (z) diff --git a/regression/test009.expr b/regression/test009.expr index 869d188fa..0cd57768e 100644 --- a/regression/test009.expr +++ b/regression/test009.expr @@ -1,4 +1,4 @@ -global n = 2, k = 10; +local n = 2, k = 10; {local res = 1; while k > 0 do diff --git a/regression/test010.expr b/regression/test010.expr index 693fa7308..20bf666d3 100644 --- a/regression/test010.expr +++ b/regression/test010.expr @@ -1,4 +1,4 @@ -global i, s; +local i, s; i := 0; s := 0; diff --git a/regression/test011.expr b/regression/test011.expr index 0aed934c1..464fe0bca 100644 --- a/regression/test011.expr +++ b/regression/test011.expr @@ -1,4 +1,4 @@ -global x; +local x; x:=0; if x diff --git a/regression/test012.expr b/regression/test012.expr index 19323a619..8610d9a90 100644 --- a/regression/test012.expr +++ b/regression/test012.expr @@ -1,4 +1,4 @@ -global n; +local n; n := read (); while n >= 0 do diff --git a/regression/test013.expr b/regression/test013.expr index 0f6f1f71f..65a37e308 100644 --- a/regression/test013.expr +++ b/regression/test013.expr @@ -1,4 +1,4 @@ -global n = read (); +local n = read (); repeat diff --git a/regression/test014.expr b/regression/test014.expr index 1e3eb51cc..c740138e0 100644 --- a/regression/test014.expr +++ b/regression/test014.expr @@ -1,4 +1,4 @@ -global n; +local n; n := read (); diff --git a/regression/test015.expr b/regression/test015.expr index d53dc4cee..dd920ae59 100644 --- a/regression/test015.expr +++ b/regression/test015.expr @@ -1,4 +1,4 @@ -global s, n, p; +local s, n, p; s := 0; n := read (); diff --git a/regression/test016.expr b/regression/test016.expr index 8cb05ff4d..f0d57022f 100644 --- a/regression/test016.expr +++ b/regression/test016.expr @@ -1,4 +1,4 @@ -global s, n; +local s, n; n := read (); diff --git a/regression/test017.expr b/regression/test017.expr index 8e0d92af0..8ccef309b 100644 --- a/regression/test017.expr +++ b/regression/test017.expr @@ -1,4 +1,4 @@ -global n, fib_1, fib_2, fib, i; +local n, fib_1, fib_2, fib, i; n := read (); diff --git a/regression/test018.expr b/regression/test018.expr index 7194e7c20..5944f5db8 100644 --- a/regression/test018.expr +++ b/regression/test018.expr @@ -1,4 +1,4 @@ -global n, c, p, q, i, m, d; +local n, c, p, q, i, m, d; n := read (); diff --git a/regression/test019.expr b/regression/test019.expr index 8145799bb..1dca6bb68 100644 --- a/regression/test019.expr +++ b/regression/test019.expr @@ -1,4 +1,4 @@ -global i, s; +local i, s; i := 0; s := 0; diff --git a/regression/test020.expr b/regression/test020.expr index f1cb18628..3262f4841 100644 --- a/regression/test020.expr +++ b/regression/test020.expr @@ -1,4 +1,4 @@ -global s, n, p; +local s, n, p; s := 0; n := read (); diff --git a/regression/test021.expr b/regression/test021.expr index d59a0dad7..3c4dd46c5 100644 --- a/regression/test021.expr +++ b/regression/test021.expr @@ -1,4 +1,4 @@ -global n, f; +local n, f; n := read (); f := 1; diff --git a/regression/test022.expr b/regression/test022.expr index c00de50c0..96b91bbaf 100644 --- a/regression/test022.expr +++ b/regression/test022.expr @@ -1,4 +1,4 @@ -global n, fib_1, fib_2, fib, i; +local n, fib_1, fib_2, fib, i; n := read (); diff --git a/regression/test023.expr b/regression/test023.expr index dbd4c2375..30c0e8365 100644 --- a/regression/test023.expr +++ b/regression/test023.expr @@ -1,4 +1,4 @@ -global s, n; +local s, n; s := 0; diff --git a/regression/test024.expr b/regression/test024.expr index 7daf2d703..fca2334e2 100644 --- a/regression/test024.expr +++ b/regression/test024.expr @@ -6,7 +6,7 @@ fun test2 (b) { a := b } -global x, a, b; +local x, a, b; x := read (); diff --git a/regression/test025.expr b/regression/test025.expr index 3d13f368d..a09e4f5a2 100644 --- a/regression/test025.expr +++ b/regression/test025.expr @@ -1,4 +1,4 @@ -global x, a, b, c; +local x, a, b, c; fun test1 (a) { write (a) diff --git a/regression/test026.expr b/regression/test026.expr index 960a88e6d..d713c6e01 100644 --- a/regression/test026.expr +++ b/regression/test026.expr @@ -1,4 +1,4 @@ -global x, a, b, c; +local x, a, b, c; fun test1 (a) { write (a); diff --git a/regression/test027.expr b/regression/test027.expr index d6dc0b03c..65e84bde3 100644 --- a/regression/test027.expr +++ b/regression/test027.expr @@ -1,4 +1,4 @@ -global x, a, b, c; +local x, a, b, c; fun print () { write (a); diff --git a/regression/test028.expr b/regression/test028.expr index fe1fd6338..a3299403a 100644 --- a/regression/test028.expr +++ b/regression/test028.expr @@ -1,4 +1,4 @@ -global n, i, result; +local n, i, result; fun fact (n) { if n <= 1 diff --git a/regression/test029.expr b/regression/test029.expr index 6e90cb8fb..ca6c3058b 100644 --- a/regression/test029.expr +++ b/regression/test029.expr @@ -1,4 +1,4 @@ -global i, n, result; +local i, n, result; fun fib (n) { local r; diff --git a/regression/test030.expr b/regression/test030.expr index de0af0696..ae4521f4f 100644 --- a/regression/test030.expr +++ b/regression/test030.expr @@ -1,4 +1,4 @@ -global n, i; +local n, i; fun fib (n) { if n <= 1 diff --git a/regression/test031.expr b/regression/test031.expr index 10eb9a6b9..319e962d1 100644 --- a/regression/test031.expr +++ b/regression/test031.expr @@ -1,4 +1,4 @@ -global n, i; +local n, i; fun fact (n) { if n <= 1 diff --git a/regression/test032.expr b/regression/test032.expr index bdd90a832..b5bd95e5f 100644 --- a/regression/test032.expr +++ b/regression/test032.expr @@ -1,4 +1,4 @@ -global x, m, n; +local x, m, n; fun ack (m, n) { if m == 0 then return (n+1) diff --git a/regression/test033.expr b/regression/test033.expr index f99ce3cf6..d591fc46e 100644 --- a/regression/test033.expr +++ b/regression/test033.expr @@ -1,4 +1,4 @@ -global x; +local x; fun test (n, m) { local i, s; diff --git a/regression/test034.expr b/regression/test034.expr index f02da7c6c..f380397bd 100644 --- a/regression/test034.expr +++ b/regression/test034.expr @@ -1,4 +1,4 @@ -global n, x, i; +local n, x, i; fun printString (x) { for i:=0, i diff --git a/regression/test045.expr b/regression/test045.expr index 656ae5482..599790da3 100644 --- a/regression/test045.expr +++ b/regression/test045.expr @@ -1,4 +1,4 @@ -global x; +local x; fun printString (s) { local i; diff --git a/regression/test046.expr b/regression/test046.expr index 40c4b6fb4..e5c16df88 100644 --- a/regression/test046.expr +++ b/regression/test046.expr @@ -1,4 +1,4 @@ -global n; +local n; n := read (); diff --git a/regression/test047.expr b/regression/test047.expr index 690e98d76..d42827eca 100644 --- a/regression/test047.expr +++ b/regression/test047.expr @@ -1,4 +1,4 @@ -global n; +local n; fun collect_ints_acc (v, tail) { local i; diff --git a/regression/test048.expr b/regression/test048.expr index 27b58abb0..f7e3f7ceb 100644 --- a/regression/test048.expr +++ b/regression/test048.expr @@ -1,4 +1,4 @@ -global n, y; +local n, y; fun test (n, m) { local i, s; diff --git a/regression/test049.expr b/regression/test049.expr index 740bb50b0..05550ff76 100644 --- a/regression/test049.expr +++ b/regression/test049.expr @@ -1,4 +1,4 @@ -global n, y, y2, t; +local n, y, y2, t; fun test (n, m) { local i, s; diff --git a/regression/test050.expr b/regression/test050.expr index e4d5fcae2..f9c30f715 100644 --- a/regression/test050.expr +++ b/regression/test050.expr @@ -1,4 +1,4 @@ -global n, x, y; +local n, x, y; n := read (); x := [1]; diff --git a/regression/test051.expr b/regression/test051.expr index 247600d84..fdf03c08f 100644 --- a/regression/test051.expr +++ b/regression/test051.expr @@ -1,4 +1,4 @@ -global n; +local n; fun sum (l) { case l of diff --git a/regression/test052.expr b/regression/test052.expr index bdf94113e..2c24109af 100644 --- a/regression/test052.expr +++ b/regression/test052.expr @@ -1,4 +1,4 @@ -global n; +local n; fun hd (l) { case l of diff --git a/regression/test053.expr b/regression/test053.expr index f6f5b5528..fc36c038a 100644 --- a/regression/test053.expr +++ b/regression/test053.expr @@ -1,4 +1,4 @@ -global n; +local n; infix "===" at "==" (v1, v2) { local s1, s2, i; diff --git a/regression/test054.expr b/regression/test054.expr index 9b3e90e9c..26f734417 100644 --- a/regression/test054.expr +++ b/regression/test054.expr @@ -1,4 +1,4 @@ -global x, y, z, s, i, n; +local x, y, z, s, i, n; x := y := z := 105; diff --git a/src/Driver.ml b/src/Driver.ml index ca790354b..b4650a996 100644 --- a/src/Driver.ml +++ b/src/Driver.ml @@ -8,7 +8,7 @@ let parse infile = "while"; "do"; "od"; "repeat"; "until"; "for"; - "fun"; "local"; "return"; "global"; + "fun"; "local"; "return"; "length"; "string"; "case"; "of"; "esac"; "when"; diff --git a/src/Language.ml b/src/Language.ml index ba4233d3e..5cc60b458 100644 --- a/src/Language.ml +++ b/src/Language.ml @@ -119,8 +119,8 @@ module State = (* State: global state, local state, scope variables *) type 'a t = | I - | G of (string * bool) list * (string -> ('a, 'a t) Value.t) - | L of (string * bool) list * (string -> ('a, 'a t) Value.t) * 'a t + | G of (string * bool) list * (string -> 'a) + | L of (string * bool) list * (string -> 'a) * 'a t (* Undefined state *) let undefined x = failwith (Printf.sprintf "Undefined variable: %s" x) @@ -265,7 +265,8 @@ module Expr = (* The type of configuration: a state, an input stream, an output stream, and a stack of values *) - type 'a config = 'a State.t * int list * int list * ('a, 'a State.t) Value.t list + type 'a value = ('a, 'a value State.t) Value.t + type 'a config = 'a value State.t * int list * int list * 'a value list (* The type for expressions. Note, in regular OCaml there is no "@type..." notation, it came from GT. @@ -770,8 +771,8 @@ module Definition = | `Fail msg -> raise (Semantic_error msg) }; local_var[infix][expr][def]: name:LIDENT value:(-"=" expr[def][infix][Expr.Val])? {name, `Variable value}; - parse[kind][infix][expr][def]: - kind locs:!(Util.list (local_var infix expr def)) ";" {locs, infix} + parse[infix][expr][def]: + %"local" locs:!(Util.list (local_var infix expr def)) ";" {locs, infix} | <(name, infix')> : head[infix] "(" args:!(Util.list0 arg) ")" body:expr[def][infix'][Expr.Void] { [(name, `Fun (args, body))], infix' @@ -797,10 +798,8 @@ let eval expr i = (* Top-level parser *) ostap ( - parse[infix]: !(Expr.scope (definitions global) infix Expr.Void (Expr.parse (definitions local))); - local: %"local" {`Local}; - global: %"global" {`Global}; - definitions[kind][infix]: - <(def, infix')> : !(Definition.parse kind infix Expr.basic (definitions local)) <(defs, infix'')> : definitions[kind][infix'] {def @ defs, infix''} + parse[infix]: !(Expr.scope definitions infix Expr.Void (Expr.parse definitions)); + definitions[infix]: + <(def, infix')> : !(Definition.parse infix Expr.basic definitions) <(defs, infix'')> : definitions[infix'] {def @ defs, infix''} | empty {[], infix} )