From 22659d8fedad11d43134cfc860b65841536035c3 Mon Sep 17 00:00:00 2001 From: Dmitry Boulytchev Date: Sun, 25 Feb 2018 17:39:54 +0300 Subject: [PATCH] Intermediate --- regression/test000.log | 0 src/Driver.ml | 2 +- src/Language.ml | 36 ++++++++++++++++++++++++++++++------ 3 files changed, 31 insertions(+), 7 deletions(-) delete mode 100644 regression/test000.log diff --git a/regression/test000.log b/regression/test000.log deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/Driver.ml b/src/Driver.ml index 4082ccbab..67dd012d7 100644 --- a/src/Driver.ml +++ b/src/Driver.ml @@ -6,6 +6,7 @@ let parse infile = (object inherit Matcher.t s inherit Util.Lexers.decimal s + inherit Util.Lexers.ident ["read"; "write"] s inherit Util.Lexers.skip [ Matcher.Skip.whitespaces " \t\n"; Matcher.Skip.lineComment "--"; @@ -18,7 +19,6 @@ let parse infile = let main = try let interpret = Sys.argv.(1) = "-i" in - let stack = Sys.argv.(1) = "-s" in let infile = Sys.argv.(2) in match parse infile with | `Ok prog -> diff --git a/src/Language.ml b/src/Language.ml index 35ffeeb06..9b6d9ac72 100644 --- a/src/Language.ml +++ b/src/Language.ml @@ -43,8 +43,7 @@ module Expr = Takes a state and an expression, and returns the value of the expression in the given state. - *) - + *) let to_func op = let bti = function true -> 1 | _ -> 0 in let itb b = b <> 0 in @@ -71,9 +70,28 @@ module Expr = | Var x -> st x | Binop (op, x, y) -> to_func op (eval st x) (eval st y) - (* Statement parser *) - ostap ( - parse: empty {failwith "Not implemented yet"} + (* Expression parser *) + ostap ( + parse: + !(Ostap.Util.expr + (fun x -> x) + (Array.map (fun (a, s) -> a, + List.map (fun s -> ostap(- $(s)), (fun x y -> Binop (s, x, y))) s + ) + [| + `Lefta, ["!!"]; + `Lefta, ["&&"]; + `Nona , ["=="; "!="; "<="; "<"; ">="; ">"]; + `Lefta, ["+" ; "-"]; + `Lefta, ["*" ; "/"; "%"]; + |] + ) + primary); + + primary: + n:DECIMAL {Const n} + | x:IDENT {Var x} + | -"(" parse -")" ) end @@ -107,7 +125,13 @@ module Stmt = (* Statement parser *) ostap ( - parse: empty {failwith "Not implemented yet"} + parse: + s:stmt ";" ss:parse {Seq (s, ss)} + | stmt; + stmt: + "read" "(" x:IDENT ")" {Read x} + | "write" "(" e:!(Expr.parse) ")" {Write e} + | x:IDENT ":=" e:!(Expr.parse) {Assign (x, e)} ) end