pingus-cvs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Pingus-CVS] r3483 - trunk/sexpr


From: grumbel at BerliOS
Subject: [Pingus-CVS] r3483 - trunk/sexpr
Date: Sun, 4 Nov 2007 10:33:37 +0100

Author: grumbel
Date: 2007-11-04 10:33:37 +0100 (Sun, 04 Nov 2007)
New Revision: 3483

Modified:
   trunk/sexpr/level-syntax.scm
   trunk/sexpr/parser.rb
   trunk/sexpr/schema.rb
   trunk/sexpr/schema_test.rb
   trunk/sexpr/sexpr.rb
Log:
- some more validator work

Modified: trunk/sexpr/level-syntax.scm
===================================================================
--- trunk/sexpr/level-syntax.scm        2007-11-04 08:18:48 UTC (rev 3482)
+++ trunk/sexpr/level-syntax.scm        2007-11-04 09:33:37 UTC (rev 3483)
@@ -4,29 +4,30 @@
   (use  "required")
   (type (mapping
          (children
-          (element (name "version") (type (int)))
+          (element (name "version") (type (integer)))
           (element (name "head") 
             (type (mapping
                    (children
                     (element (name "levelname")        (type (string)))
                     (element (name "description")      (type (string)))
                     (element (name "author")           (type (string)))
-                    (element (name "number-of-pingus") (type (int)))
-                    (element (name "number-to-save")   (type (int)))
-                    (element (name "time")             (type (int)))
-                    (element (name "difficulty")       (type (int)))
-                    (element (name "playable")         (type (int)))
+                    (element (name "number-of-pingus") (type (integer)))
+                    (element (name "number-to-save")   (type (integer)))
+                    (element (name "levelsize")        (type (size)))
+                    (element (name "time")             (type (integer)))
+                    (element (name "difficulty")       (type (integer)))
+                    (element (name "playable")         (type (integer)))
                     (element (name "comment")          (type (string)))
                     (element (name "music")            (type (string)))
                     (element (name "actions")
                       (type (mapping
                              (children
-                              (element (name "basher")   (type (int (min 1))))
-                              (element (name "blocker")  (type (int (min 1))))
-                              (element (name "bomber")   (type (int (min 1))))
-                              (element (name "bridger")  (type (int (min 1))))
-                              (element (name "climber")  (type (int (min 1))))
-                              (element (name "jumper")   (type (int (min 1))))
+                              (element (name "basher")   (type (integer (min 
1))) (use "optional"))
+                              (element (name "blocker")  (type (integer (min 
1))) (use "optional"))
+                              (element (name "bomber")   (type (integer (min 
1))) (use "optional"))
+                              (element (name "bridger")  (type (integer (min 
1))) (use "optional"))
+                              (element (name "climber")  (type (integer (min 
1))) (use "optional"))
+                              (element (name "jumper")   (type (integer (min 
1))) (use "optional"))
                               ))))
                     ))))
           (element (name "objects")
@@ -43,7 +44,37 @@
                               (children
                                (element (name "position") (type (vector2i)))
                                (element (name "surface")  (type (surface)))
-                               (element (name "release-rate") (type (int)))))))
+                               (element (name "release-rate") (type 
(integer)))))))
+
+                     (element (name "surface-background")
+                       (type (mapping
+                              (children
+                               (element (name "position") (type (vector2i)))
+                               (element (name "surface")  (type (surface)))))))
+
+                     (element (name "liquid")
+                       (type (mapping
+                              (children
+                               (element (name "position") (type (vector2i)))
+                               (element (name "surface")  (type (surface)))))))
+
+                     (element (name "hotspot")
+                       (type (mapping
+                              (children
+                               (element (name "position") (type (vector2i)))
+                               (element (name "surface")  (type (surface)))))))
+
+
+                     (element (name "exit")
+                       (type (mapping
+                              (children
+                               (element (name "position") (type (vector2i)))
+                               (element (name "surface")  (type (surface)))))))
+
+                     (element (name "entrance")
+                       (type (mapping
+                              (children
+                               (element (name "position") (type 
(vector2i)))))))
                      ))))
           ))))
 

Modified: trunk/sexpr/parser.rb
===================================================================
--- trunk/sexpr/parser.rb       2007-11-04 08:18:48 UTC (rev 3482)
+++ trunk/sexpr/parser.rb       2007-11-04 09:33:37 UTC (rev 3483)
@@ -220,10 +220,6 @@
       end
     end
 
-    def get_pos()
-      return "@line:@column"
-    end
-
     def submit(type, include_current_character)
       @state = :look_for_token
 
@@ -235,41 +231,44 @@
         @token_start = @pos
         @advance = false
       end
-      
+
+      # FIXME: This refers to the end of the token, not the start
+      pretty_pos = "address@hidden:address@hidden"
+     
       case type
       when :boolean
-        @tokens << Boolean.new(current_token == "#t", get_pos())
+        @tokens << Boolean.new(current_token == "#t", pretty_pos)
         
       when :integer
-        @tokens << Integer.new(current_token.to_i, get_pos())
+        @tokens << Integer.new(current_token.to_i, pretty_pos)
 
       when :real
-        @tokens << Real.new(current_token.to_f, get_pos())
+        @tokens << Real.new(current_token.to_f, pretty_pos)
 
       when :string
         @tokens << String.new(current_token[1..-2].
                               gsub("\\n", "\n").
                               gsub("\\\"", "\"").
                               gsub("\\t", "\t"),
-                              get_pos())
+                              pretty_pos)
 
       when :symbol
-        @tokens << Symbol.new(current_token, get_pos())
+        @tokens << Symbol.new(current_token, pretty_pos)
         
       when :list_start
-        @tokens << [:list_start, get_pos()]
+        @tokens << [:list_start, pretty_pos]
 
       when :list_end
-        @tokens << [:list_end, get_pos()]
+        @tokens << [:list_end, pretty_pos]
 
       when :comment
         if @parse_comments then
-          @tokens << Comment.new(current_token, get_pos())
+          @tokens << Comment.new(current_token, pretty_pos)
         end
 
       when :whitespace
         if @parse_whitespace then
-          @tokens << Whitespace.new(current_token, get_pos())
+          @tokens << Whitespace.new(current_token, pretty_pos)
         end
 
       else

Modified: trunk/sexpr/schema.rb
===================================================================
--- trunk/sexpr/schema.rb       2007-11-04 08:18:48 UTC (rev 3482)
+++ trunk/sexpr/schema.rb       2007-11-04 09:33:37 UTC (rev 3483)
@@ -50,34 +50,46 @@
       @root.validate(sexpr)
     end
 
-    def type_factor(reader)
+    def Schema.type_factory(reader)
       case reader.name
-      when "mapping":
+      when "mapping"
           return MappingType.new(reader)
           
-      when "sequence":
+      when "sequence"
           return SequenceType.new(reader)
 
-      when "choice":
+      when "choice"
           return SequencType.new(reader)
           
-      when "integer":
+      when "integer"
           return IntegerType.new(reader)
         
-      when "real":
+      when "real"
           return RealType.new(reader)
         
-      when "boolean":
+      when "boolean"
           return BooleanType.new(reader)
 
-      when "string":
+      when "string"
           return StringType.new(reader)
 
-      when "symbol":
+      when "symbol"
           return SymbolType.new(reader)
 
-      else:
-          raise "#{reader.pos}: Unknown Type '#{reader.name}'"
+      when "vector2i"
+        return Vector2iType.new(reader)
+
+      when "size"
+        return Vector2iType.new(reader)
+
+      when "surface"
+        return SurfaceType.new(reader)
+
+      when "any"
+          return AnyType.new(reader)
+
+      else
+          raise "#{reader.pos}: unknown type '#{reader.name}'"
       end
   end
   end # Schema
@@ -108,7 +120,7 @@
             if sexpr[0].value != @name then
               raise "#{sexpr.pos}: expected symbol '#{name}', got 
#{sexpr[0].value}"
             else
-              puts "ok: address@hidden"
+              puts "Element ok: address@hidden"
               # ok, now check type and/or validate children
               type.validate(sexpr[1..-1])
             end
@@ -118,6 +130,11 @@
     end
   end
 
+  class AnyType
+    def initialize(reader)
+    end
+  end
+
   class SymbolType
     def initialize(reader)
     end
@@ -126,14 +143,39 @@
   class StringType
     def initialize(reader)
     end
+
+    def validate(element)
+    end
   end
 
+  class Vector2iType
+    def initialize(reader)
+    end
+
+    def validate(element)
+    end
+  end
+
+  class ColorType
+    def initialize(reader)
+    end
+  end
+
+  class SurfaceType
+    def initialize(reader)
+    end
+  end
+
   class IntegerType
+    def initialize(reader)
+      # FIXME: add min/max and other possible range restrictions here
+    end
+
     def validate(sexpr)
       if sexpr.length() != 1 then
         raise "#{sexpr.pos}: expected a single integer got #{sexpr.to_s}"
       else
-        if not sexpr[0].is_a?(SExpr::Integer) then
+        if not sexpr[0].is_a?(Integer) then
           raise "#{sexpr.pos}: expected integer got #{sexpr[0].class}"
         else
           # ok
@@ -173,10 +215,12 @@
 
     def validate(sexpr)
       sexpr.each{ |el|
-        if not check(el[0].value) then
+        child = @children.find{|i| i.name == el[0].value } # FIXME: Works, but 
why? Shouldn't String and Symbol clash
+        if not child then
           raise "#{el.pos}: invalid element '#{el[0].value}'"
         else
-          puts "ok: #{el[0].value}"
+          puts "MappingType Child: ok: #{el[0].value} #{child}"
+          child.validate(el)
         end
       }
     end
@@ -189,12 +233,18 @@
     end    
 
     def check_element(name)
-      
+      puts "SequenceType: #{name}"
+      el = @children.find{|i| i.name == name.value }
+      if not el then
+        raise "#{name.pos}: SequenceType: element '#{name}' not allowed"
+      else
+        # ok
+      end
     end
 
     def validate(sexpr) # sexpr == SExpr::List
       sexpr.each{ |el|
-        
+        check_element(el[0])
       }
     end
   end

Modified: trunk/sexpr/schema_test.rb
===================================================================
--- trunk/sexpr/schema_test.rb  2007-11-04 08:18:48 UTC (rev 3482)
+++ trunk/sexpr/schema_test.rb  2007-11-04 09:33:37 UTC (rev 3483)
@@ -4,13 +4,17 @@
 require "parser.rb"
 require "schema.rb"
 
-if ARGV.length != 2 then
-  puts "Usage: schema_test.rb SCHEMAFILE SCMFILE"
-else
-  schema = SExpr::Schema.new(File.new(ARGV[0]).read())
-  sexpr  = SExpr::SExpr.parse(File.new(ARGV[1]).read())
-  # puts schema.inspect
-  schema.validate(sexpr[0])
+begin
+  if ARGV.length != 2 then
+    puts "Usage: schema_test.rb SCHEMAFILE SCMFILE"
+  else
+    schema = SExpr::Schema.new(File.new(ARGV[0]).read())
+    sexpr  = SExpr::SExpr.parse(File.new(ARGV[1]).read())
+    # puts schema.inspect
+    schema.validate(sexpr[0])
+  end
+rescue RuntimeError
+  puts "#{ARGV[1]}:#{$!}"
 end
 
 # EOF #

Modified: trunk/sexpr/sexpr.rb
===================================================================
--- trunk/sexpr/sexpr.rb        2007-11-04 08:18:48 UTC (rev 3482)
+++ trunk/sexpr/sexpr.rb        2007-11-04 09:33:37 UTC (rev 3483)
@@ -110,7 +110,7 @@
 
     def initialize(value, pos = nil)
       super(pos)
-      @value = value
+      @value = value # FIXME: Is this supposed to be a String or Symbol?
     end
 
     def to_s()





reply via email to

[Prev in Thread] Current Thread [Next in Thread]