]> git.mdlowis.com Git - proto/sclpl-rb.git/commitdiff
added record and array literals
authorMichael D. Lowis <mike@mdlowis.com>
Thu, 6 Feb 2020 02:49:21 +0000 (21:49 -0500)
committerMichael D. Lowis <mike@mdlowis.com>
Thu, 6 Feb 2020 02:49:21 +0000 (21:49 -0500)
compile.rb
example.src

index 7a5ef8e130dd1e3196f7c531548d62ae2fa14156..0cd437bad71790ab676cb84ac8b3a210264a4400 100755 (executable)
@@ -157,7 +157,7 @@ class Parser
 
   RULES = {
     "."     => { prefix: nil,       infix: :access,    level: :call   },
-    "["     => { prefix: nil,       infix: :subscript, level: :call   },
+    "["     => { prefix: :constant, infix: :subscript, level: :call   },
     "("     => { prefix: :grouping, infix: :func_call, level: :call   },
     "+"     => { prefix: :unary,    infix: :binary,    level: :term   },
     "-"     => { prefix: :unary,    infix: :binary,    level: :term   },
@@ -165,6 +165,7 @@ class Parser
     "/"     => { prefix: nil,       infix: :binary,    level: :factor },
     "="     => { prefix: nil,       infix: :assign,    level: :assign },
     :ident  => { prefix: :variable, infix: nil,        level: :none   },
+    "{"     => { prefix: :constant, infix: nil,        level: :none   },
     :nil    => { prefix: :constant, infix: nil,        level: :none   },
     :bool   => { prefix: :constant, infix: nil,        level: :none   },
     :int    => { prefix: :constant, infix: nil,        level: :none   },
@@ -448,7 +449,7 @@ class Parser
       if @prev.type == :byte
         error("invalid byte value") if (val < 0 || val > 255)
       end
-      Ast::Val.new(Type::Int, nil)
+      Ast::Val.new(Type::Int, val.to_i)
     elsif (@prev.type == :string)
       Ast::Val.new("String", @prev.text)
     elsif (@prev.type == :nil)
@@ -459,6 +460,24 @@ class Parser
       error("no float support yet")
     elsif (@prev.type == :char)
       error("no char support yet")
+    elsif (@prev.type == "[")
+      ary = []
+      while !matches("]")
+        ary << expression()
+        expect(",") if !matches("]")
+      end
+      expect("]")
+      ary
+    elsif (@prev.type == "{")
+      hsh = {}
+      while !matches("}")
+        name = expect(:ident).text
+        expect("=")
+        hsh[name] = expression()
+        expect(",") if !matches("}")
+      end
+      expect("}")
+      hsh
     else
       error("not a valid constant")
     end
index b1de7e72ff3ad93275aa81271fcce98b812a1c97..a74f83544b636d047e5aa658a1961c4033d1f2ce 100644 (file)
@@ -1,7 +1,10 @@
 module Main
 imports (X11, XSel, Posix)
 
-cmd : ?[String] = true
+cmd : ?[String] = {
+    foo = 123,
+    bar = 321
+}
 
 fetchsel(sel : String)
 {