diff --git a/regression/Makefile b/regression/Makefile index 1fd04d785..da9ce8f1d 100644 --- a/regression/Makefile +++ b/regression/Makefile @@ -9,7 +9,7 @@ check: $(TESTS) $(TESTS): %: %.expr @echo $@ # @$(RC) $< && cat $@.input | ./$@ > $@.log && diff $@.log orig/$@.log - cat $@.input | $(RC) -i $< > $@.log && diff $@.log orig/$@.log + cat $@.input | $(RC) -i $< > $@.log && diff $@.log orig/$@.log; true # @cat $@.input | $(RC) -s $< > $@.log && diff $@.log orig/$@.log clean: diff --git a/regression/test001.expr b/regression/test001.expr index 8f379e6da..f8bdc2601 100644 --- a/regression/test001.expr +++ b/regression/test001.expr @@ -1,5 +1,4 @@ -local x, y, z; -read (x); -read (y); +x := read (); +y := read (); z := x*y*3; write (z) diff --git a/regression/test029.expr b/regression/test029.expr index 855193cd8..63e9885de 100644 --- a/regression/test029.expr +++ b/regression/test029.expr @@ -1,4 +1,5 @@ -fun fib (n) local r { +fun fib (n) { + local r; if n <= 1 then result := 1 else diff --git a/regression/test033.expr b/regression/test033.expr index 5224ba35f..324e81cc2 100644 --- a/regression/test033.expr +++ b/regression/test033.expr @@ -1,4 +1,5 @@ -fun test (n, m) local i, s { +fun test (n, m) { + local i, s; s := 0; for i := 0, i <= n, i := i + 1 do s := s + i; diff --git a/regression/test035.expr b/regression/test035.expr index ed5372044..9b8248d7f 100644 --- a/regression/test035.expr +++ b/regression/test035.expr @@ -1,4 +1,5 @@ -fun printArray (x) local elem { +fun printArray (x) { + local elem; if x.length == 0 then return fi; for i:=0, i return Cons (a, tail) | #string -> return tail diff --git a/regression/test048.expr b/regression/test048.expr index d84d9bc8b..00b4d8b13 100644 --- a/regression/test048.expr +++ b/regression/test048.expr @@ -1,4 +1,5 @@ -fun test (n, m) local i, s { +fun test (n, m) { + local i, s; write (n); write (m); return n diff --git a/regression/test049.expr b/regression/test049.expr index 5d326d547..f3389fd8a 100644 --- a/regression/test049.expr +++ b/regression/test049.expr @@ -1,4 +1,5 @@ -fun test (n, m) local i, s { +fun test (n, m) { + local i, s; s := 0; for i := 0, i <= n, i := i + 1 do s := s + i; diff --git a/regression/test051.expr b/regression/test051.expr index 4fd56699a..3e2c4757a 100644 --- a/regression/test051.expr +++ b/regression/test051.expr @@ -12,7 +12,8 @@ fun print_list (l) { esac } -fun array_to_list (a) local l, i { +fun array_to_list (a) { + local l, i; l := {}; for i := a.length, i > 0, i := i-1 do l := a[i-1] : l diff --git a/regression/test053.expr b/regression/test053.expr index 2a9439106..6b5f48bba 100644 --- a/regression/test053.expr +++ b/regression/test053.expr @@ -1,4 +1,6 @@ -infix "===" at "==" (v1, v2) local s1, s2, i { +infix "===" at "==" (v1, v2) { + local s1, s2, i; + s1 := v1.string; s2 := v2.string; diff --git a/src/Driver.ml b/src/Driver.ml index 87e8c0c6b..d70167ddf 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"; + "fun"; "local"; "return"; "global"; "length"; "string"; "case"; "of"; "esac"; "when"; diff --git a/src/Language.ml b/src/Language.ml index a840e36a4..f902564d5 100644 --- a/src/Language.ml +++ b/src/Language.ml @@ -259,7 +259,7 @@ module Expr = (* entering the scope *) | Scope of string list * t (* leave a scope *) | Leave (* intrinsic (for evaluation) *) | Intrinsic of (config -> config) - (* control (for control flow) *) | Control of (config -> t * config) + (* control (for control flow) *) | Control of (config -> t * config) (* Reff : parsed expression should return value Reff (look for ":="); Val : -//- returns simple value; @@ -553,18 +553,16 @@ module Expr = | c:CHAR => {notRef atr} => {ignore atr (Const (Char.code c))} | "[" es:!(Util.list0)[parse def infix Val] "]" => {notRef atr} => {ignore atr (Array es)} | "{" <(d, infix')> : def[infix] expr:parse[def][infix][atr] "}" => {notRef atr} => { - ignore atr ( let vars, body = List.fold_left (fun (vs, bd) -> function - | (name, `Local value) -> name :: vs, (match value with None -> bd | Some v -> Seq (Assign (Var name, v), bd)) - | _ -> invalid_arg "function" + | (name, `Variable value) -> name :: vs, (match value with None -> bd | Some v -> Seq (Assign (Var name, v), bd)) + | _ -> invalid_arg "function" ) ([], expr) d in Scope (vars, body) - ) } | "{" es:!(Util.list0)[parse def infix Val] "}" => {notRef atr} => {ignore atr (match es with | [] -> Const 0 @@ -691,7 +689,7 @@ module Definition = struct (* The type for a definition: aither a function/infix, or a local variable *) - type t = string * [`Fun of string list * Expr.t | `Local of Expr.t option] + type t = string * [`Fun of string list * Expr.t | `Variable of Expr.t option] ostap ( arg : LIDENT; @@ -708,9 +706,9 @@ module Definition = | `Ok infix' -> name, infix' | `Fail msg -> raise (Semantic_error msg) }; - local_var[infix][expr][def]: name:LIDENT value:(-"=" expr[def][infix][Expr.Val])? {name, `Local value}; - parse[infix][expr][def]: - %"local" locs:!(Util.list (local_var infix expr def)) ";" {locs, infix} + 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} | <(name, infix')> : head[infix] "(" args:!(Util.list0 arg) ")" body:expr[def][infix'][Expr.Void] { [(name, `Fun (args, body))], infix' @@ -752,8 +750,10 @@ let eval ((defs, body) : t) i = (* Top-level parser *) ostap ( - parse[infix]: <(defs, infix')> : definitions[infix] body:!(Expr.parse definitions infix' Expr.Void) {(defs : Definition.t list), body}; - definitions[infix]: - <(def, infix')> : !(Definition.parse infix Expr.parse definitions) <(defs, infix'')> : definitions[infix'] {def @ defs, infix''} + parse[infix]: <(defs, infix')> : definitions[global][infix] body:!(Expr.parse (definitions local) infix' Expr.Void) {(defs : Definition.t list), body}; + local: %"local"; + global: %"global"; + definitions[kind][infix]: + <(def, infix')> : !(Definition.parse kind infix Expr.parse (definitions local)) <(defs, infix'')> : definitions[kind][infix'] {def @ defs, infix''} | empty {[], infix} ) diff --git a/src/Makefile b/src/Makefile index 489cb2c69..12d2d0f19 100644 --- a/src/Makefile +++ b/src/Makefile @@ -5,7 +5,7 @@ OCAMLDEP = ocamlfind dep SOURCES = Language.ml SM.ml X86.ml Driver.ml CAMLP5 = -syntax camlp5o -package ostap.syntax,GT.syntax.all PXFLAGS = $(CAMLP5) -BFLAGS = -rectypes +BFLAGS = -rectypes -g OFLAGS = $(BFLAGS) all: .depend $(TOPFILE).opt