pingus-cvs
[Top][All Lists]
Advanced

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

[Pingus-CVS] r3482 - trunk/sexpr


From: grumbel at BerliOS
Subject: [Pingus-CVS] r3482 - trunk/sexpr
Date: Sun, 4 Nov 2007 09:18:49 +0100

Author: grumbel
Date: 2007-11-04 09:18:48 +0100 (Sun, 04 Nov 2007)
New Revision: 3482

Modified:
   trunk/sexpr/reader.rb
   trunk/sexpr/schema.rb
   trunk/sexpr/schema_test.rb
   trunk/sexpr/sexpr.rb
   trunk/sexpr/sexpr_test.rb
Log:
- added Array.to_sexpr call
- some more Schema work

Modified: trunk/sexpr/reader.rb
===================================================================
--- trunk/sexpr/reader.rb       2007-11-04 04:17:31 UTC (rev 3481)
+++ trunk/sexpr/reader.rb       2007-11-04 08:18:48 UTC (rev 3482)
@@ -28,7 +28,7 @@
       end
     end
     
-    attr_reader :name
+    attr_reader :name, :pos
 
     def initialize(sexpr)
       if not sexpr.is_a?(List) then
@@ -37,6 +37,7 @@
         raise "#{sexpr.pos}: Error: Reader expected List with one or more 
elements"
       else
         @name  = sexpr[0].value
+        @pos   = sexpr[0].pos
         @sexpr = sexpr[1..-1]
       end        
     end
@@ -138,6 +139,10 @@
         return nil
       end
     end
+
+    def sections()
+      return @sexpr.map{|el| Reader.new(el) }
+    end
   end
 end
 

Modified: trunk/sexpr/schema.rb
===================================================================
--- trunk/sexpr/schema.rb       2007-11-04 04:17:31 UTC (rev 3481)
+++ trunk/sexpr/schema.rb       2007-11-04 08:18:48 UTC (rev 3482)
@@ -20,6 +20,7 @@
 require "parser.rb"
 
 module SExpr
+
   class Schema
     def initialize(schema)
       if schema.is_a?(SExpr) then
@@ -46,10 +47,41 @@
     end
 
     def validate(sexpr)
-      
+      @root.validate(sexpr)
     end
+
+    def type_factor(reader)
+      case reader.name
+      when "mapping":
+          return MappingType.new(reader)
+          
+      when "sequence":
+          return SequenceType.new(reader)
+
+      when "choice":
+          return SequencType.new(reader)
+          
+      when "integer":
+          return IntegerType.new(reader)
+        
+      when "real":
+          return RealType.new(reader)
+        
+      when "boolean":
+          return BooleanType.new(reader)
+
+      when "string":
+          return StringType.new(reader)
+
+      when "symbol":
+          return SymbolType.new(reader)
+
+      else:
+          raise "#{reader.pos}: Unknown Type '#{reader.name}'"
+      end
   end
-
+  end # Schema
+
   class Element
     attr_reader :name  # name of the expected element
     attr_reader :use   # required, optional, forbidden
@@ -58,13 +90,16 @@
     def initialize(reader)
       @use  = reader.read_string("use")
       @name = reader.read_string("name")
+      
+      type_reader = reader.read_section("type").sections()[0]
+      @type = Schema.type_factory(type_reader)
     end
     
     def validate(sexpr)
       if not sexpr.is_a?(List) then
         raise "#{sexpr.pos}: expected list, got #{sexpr.class}"
       else
-        if sexpr.value.empty() then
+        if sexpr.value.empty? then
           raise "#{sexpr.pos}: expected a non-empty List"
         else
           if not sexpr[0].is_a?(Symbol) then
@@ -73,6 +108,7 @@
             if sexpr[0].value != @name then
               raise "#{sexpr.pos}: expected symbol '#{name}', got 
#{sexpr[0].value}"
             else
+              puts "ok: address@hidden"
               # ok, now check type and/or validate children
               type.validate(sexpr[1..-1])
             end
@@ -81,7 +117,17 @@
       end
     end
   end
-
+
+  class SymbolType
+    def initialize(reader)
+    end
+  end
+
+  class StringType
+    def initialize(reader)
+    end
+  end
+
   class IntegerType
     def validate(sexpr)
       if sexpr.length() != 1 then
@@ -95,7 +141,7 @@
       end
     end
   end
-
+
   class RealType
     def validate(sexpr)
       if sexpr.length() != 1 then
@@ -109,20 +155,64 @@
       end
     end
   end
-
+
   # A list of ((key value) ...) 
   class MappingType
-    
+    def initialize(reader)
+      @children = reader.read_section("children").sections.map{|el| 
Element.new(el) }
+    end
+
+    def check(name)
+      @children.each{|i|
+        if i.name == name then
+          return true
+        end
+      }
+      return false
+    end
+
+    def validate(sexpr)
+      sexpr.each{ |el|
+        if not check(el[0].value) then
+          raise "#{el.pos}: invalid element '#{el[0].value}'"
+        else
+          puts "ok: #{el[0].value}"
+        end
+      }
+    end
   end
-  
+  
   # A list of other elements ((foo 5) (bar 10) (baz "foo") ...)
   class SequenceType
-    
+    def initialize(reader)
+      @children = reader.read_section("children").sections.map{|el| 
Element.new(el) }
+    end    
+
+    def check_element(name)
+      
+    end
+
+    def validate(sexpr) # sexpr == SExpr::List
+      sexpr.each{ |el|
+        
+      }
+    end
   end
-  
+
   class ChoiceType
-    
+    def initialize(reader)
+      @children = reader.read_section("children").sections.map{|el| 
Element.new(el) }
+    end    
+
+    def validate(sexpr)
+      if sexpr.length() == 1 then
+        # sexpr[0]
+      else
+        raise "Expected exactly one subtag" 
+      end
+    end
   end
+
 end
 
 # EOF #

Modified: trunk/sexpr/schema_test.rb
===================================================================
--- trunk/sexpr/schema_test.rb  2007-11-04 04:17:31 UTC (rev 3481)
+++ trunk/sexpr/schema_test.rb  2007-11-04 08:18:48 UTC (rev 3482)
@@ -9,8 +9,8 @@
 else
   schema = SExpr::Schema.new(File.new(ARGV[0]).read())
   sexpr  = SExpr::SExpr.parse(File.new(ARGV[1]).read())
-
-  schema.validate(sexpr)
+  # puts schema.inspect
+  schema.validate(sexpr[0])
 end
 
 # EOF #

Modified: trunk/sexpr/sexpr.rb
===================================================================
--- trunk/sexpr/sexpr.rb        2007-11-04 04:17:31 UTC (rev 3481)
+++ trunk/sexpr/sexpr.rb        2007-11-04 08:18:48 UTC (rev 3482)
@@ -44,7 +44,7 @@
   class Boolean < SExpr
     attr_reader :value
 
-    def initialize(value, pos)
+    def initialize(value, pos = nil)
       super(pos)
       @value = value
     end
@@ -62,7 +62,7 @@
   class Integer < SExpr
     attr_reader :value
 
-    def initialize(value, pos)
+    def initialize(value, pos = nil)
       super(pos)
       @value = value
     end
@@ -76,7 +76,7 @@
   class Real < SExpr
     attr_reader :value
 
-    def initialize(value, pos)
+    def initialize(value, pos = nil)
       super(pos)
       @value = value
     end
@@ -120,8 +120,10 @@
 
   # (foo bar baz)
   class List < SExpr
-    attr_reader :children  
+    include Enumerable
 
+    attr_reader :children, :value
+
     def initialize(value, pos = nil)
       super(pos)
       @value = value
@@ -131,8 +133,16 @@
       @value << el
     end
 
+    def <<(el)
+      @value << el
+    end
+
     def [](idx)
-      return @value[idx]      
+      if idx.is_a?(Range) then
+        return List.new(@value[idx])
+      else
+        return @value[idx]
+      end
     end
 
     def empty?()
@@ -143,6 +153,12 @@
       return @value.length 
     end
 
+    def each()
+      @value.each{|i|
+        yield i
+      }
+    end
+
     def to_s()
       return "(" + @value.map{|i| i.to_s}.join(" ") + ")"
     end
@@ -170,7 +186,7 @@
     end
   end
 
-  def Commont
+  def Comment
     def initialize(value, pos = nil)
       super(pos)
       @value = value
@@ -178,4 +194,26 @@
   end
 end
 
+class Array
+  def to_sexpr()
+    lst = SExpr::List.new([])
+    each {|el|
+      if el.is_a?(Symbol) then
+        lst << SExpr::Symbol.new(el)
+      elsif el.is_a?(String) then
+        lst << SExpr::String.new(el)
+      elsif el.is_a?(Integer) then
+        lst << SExpr::Integer.new(el)
+      elsif el.is_a?(Float) then
+        lst << SExpr::Real.new(el)
+      elsif el == true or el == false then
+        lst << SExpr::Boolean.new(el)
+      elsif el.is_a?(Array) then
+        lst << el.to_sexpr()
+      end
+    }
+    return lst
+  end
+end
+
 # EOF #

Modified: trunk/sexpr/sexpr_test.rb
===================================================================
--- trunk/sexpr/sexpr_test.rb   2007-11-04 04:17:31 UTC (rev 3481)
+++ trunk/sexpr/sexpr_test.rb   2007-11-04 08:18:48 UTC (rev 3482)
@@ -7,12 +7,14 @@
   SExpr::SExpr.parse("(bla pi8ngulevel -.51 a (b +1.5) -5)").each{|el|
     puts el.to_ruby.inspect
   }
+  
 else
   ARGV.each{|filename|
     sexpr = SExpr::SExpr.parse(File.new(filename).read())
     sexpr.each{ |el|
-      el.write($stdout)
-    }
+      puts el.to_ruby.to_sexpr
+      # el.write($stdout)
+    }    
   }
 end
 





reply via email to

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