pingus-cvs
[Top][All Lists]
Advanced

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

[Pingus-CVS] r3476 - trunk/sexpr


From: grumbel at BerliOS
Subject: [Pingus-CVS] r3476 - trunk/sexpr
Date: Sat, 3 Nov 2007 10:21:46 +0100

Author: grumbel
Date: 2007-11-03 10:21:45 +0100 (Sat, 03 Nov 2007)
New Revision: 3476

Added:
   trunk/sexpr/reader.rb
   trunk/sexpr/reader_test.rb
Modified:
   trunk/sexpr/schema.rb
   trunk/sexpr/sexpr.rb
   trunk/sexpr/sexpr_test.rb
Log:
- some more stuff

Added: trunk/sexpr/reader.rb
===================================================================
--- trunk/sexpr/reader.rb       2007-11-03 07:18:34 UTC (rev 3475)
+++ trunk/sexpr/reader.rb       2007-11-03 09:21:45 UTC (rev 3476)
@@ -0,0 +1,138 @@
+#  SExpr - A simple Ruby library for parsing and validating sexpr.rb
+#  Copyright (C) 2007 Ingo Ruhnke <address@hidden>
+#
+#  This program is free software; you can redistribute it and/or
+#  modify it under the terms of the GNU General Public License
+#  as published by the Free Software Foundation; either version 2
+#  of the License, or (at your option) any later version.
+#
+#  This program is distributed in the hope that it will be useful,
+#  but WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#  GNU General Public License for more details.
+#
+#  You should have received a copy of the GNU General Public License
+#  along with this program; if not, write to the Free Software
+#  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+require "sexpr.rb"
+
+module SExpr
+  class Reader 
+    def Reader.parse(str)
+      lst = SExpr.parse(str)
+      if lst.length() == 1 then
+        return Reader.new(lst[0])
+      else
+        raise "Error: Reader expected exactly one s-expression, got 
#{lst.length}"
+      end
+    end
+    
+    attr_reader :name
+
+    def initialize(sexpr)
+      if not sexpr.is_a?(List) then
+        raise "#{sexpr.pos}: Error: Reader expected List, got #{sexpr.class}"
+      elsif sexpr.length() == 0 then
+        raise "#{sexpr.pos}: Error: Reader expected List with one or more 
elements"
+      else
+        @name  = sexpr[0]
+        @sexpr = sexpr[1..-1]
+      end        
+    end
+
+    def find_by_path(path)
+      if path.empty? then
+        raise "find_by_path: path must not be empty"
+      else
+        el = find(path[0])
+        if el then
+          if path.length() == 1 then
+            return el
+          else
+            reader = Reader.new(el)
+            return reader.find_by_path(path[1..-1])
+          end
+        else
+          return nil
+        end
+      end
+    end
+
+    def find(name)
+      if name.is_a?(Array) then
+        return find_by_path(name)
+      else
+        @sexpr.each{|el|
+          if not el.is_a?(List) then
+            raise "#{el.pos}: Error: Reader expected List, got #{el.class}"
+          elsif el.length() == 0 then
+            raise "#{el.pos}: Error: Reader expected List with one or more 
elements"
+          elsif not el[0].is_a?(Symbol) then
+            raise "#{el.pos}: Error: Reader expected Symbol, got #{el.class}"
+          else
+            if el[0].value == name then
+              return el
+            end
+          end
+        }
+        return nil
+      end
+    end
+
+    def read_integer(name)
+      el = find(name)
+      if not el then
+        return nil
+      elsif el.length() != 2 then
+        raise "#{el.pos}: Error expected exactly one integer, got #{el.to_s}"
+      elsif not el[1].is_a?(Integer) then
+        raise "#{el.pos}: Error expected a Integer, got #{el.class}"
+      else
+        return el[1].value
+      end
+    end
+
+    def read_real(name)
+      el = find(name)
+      if el.length() != 2 then
+        raise "#{el.pos}: Error expected exactly one integer, got #{el.to_s}"
+      elsif (not el[1].is_a?(Real)) and (not el[1].is_a?(Integer)) then
+        raise "#{el.pos}: Error expected a Real, got #{el.class}"
+      else
+        return el[1].value
+      end      
+    end
+
+    def read_string(name)
+      el = find(name)
+      if el.length() != 2 then
+        raise "#{el.pos}: Error expected exactly one integer, got #{el.to_s}"
+      elsif not el[1].is_a?(String) then
+        raise "#{el.pos}: Error expected a String, got #{el.class}"
+      else
+        return el[1].value
+      end
+    end
+
+    def read_symbol(name)
+      el = find(name)
+      if el.length() != 2 then
+        raise "#{el.pos}: Error expected exactly one symbol, got #{el.to_s}"
+      elsif not el[1].is_a?(String) then
+        raise "#{el.pos}: Error expected a Symbol, got #{el.class}"
+      else
+        return el[1].value
+      end      
+    end
+
+    def read_section(name)
+      el = find(name)
+      if el then
+        return Reader.new(el)
+      end
+    end
+  end
+end
+
+# EOF #

Added: trunk/sexpr/reader_test.rb
===================================================================
--- trunk/sexpr/reader_test.rb  2007-11-03 07:18:34 UTC (rev 3475)
+++ trunk/sexpr/reader_test.rb  2007-11-03 09:21:45 UTC (rev 3476)
@@ -0,0 +1,17 @@
+#!/usr/bin/ruby -w
+
+require "sexpr.rb"
+require "reader.rb"
+
+if ARGV.empty?() then
+  reader = SExpr::Reader.parse("(pingus-level (head) (bla 5))")
+  puts reader.name
+  puts reader.read_integer(["bla"])
+else
+  ARGV.each{|filename|
+    reader = SExpr::Reader.parse(File.new(filename).read())       
+    puts reader.name
+  }
+end
+
+# EOF #


Property changes on: trunk/sexpr/reader_test.rb
___________________________________________________________________
Name: svn:executable
   + *

Modified: trunk/sexpr/schema.rb
===================================================================
--- trunk/sexpr/schema.rb       2007-11-03 07:18:34 UTC (rev 3475)
+++ trunk/sexpr/schema.rb       2007-11-03 09:21:45 UTC (rev 3476)
@@ -52,7 +52,7 @@
               raise "#{sexpr.pos}: expected symbol '#{name}', got 
#{sexpr[0].value}"
             else
               # ok, now check type and/or validate children
-              
+              type.validate(sexpr[1..-1])
             end
           end            
         end
@@ -61,9 +61,33 @@
   end
 
   class IntegerType
-    
+    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
+          raise "#{sexpr.pos}: expected integer got #{sexpr[0].class}"
+        else
+          # ok
+        end
+      end
+    end
   end
 
+  class RealType
+    def validate(sexpr)
+      if sexpr.length() != 1 then
+        raise "#{sexpr.pos}: expected a single real got #{sexpr.to_s}"
+      else
+        if not sexpr[0].is_a?(SExpr::Real) then
+          raise "#{sexpr.pos}: expected integer got #{sexpr[0].class}"
+        else
+          # ok
+        end
+      end
+    end
+  end
+
   # A list of ((key value) ...) 
   class MappingType
     

Modified: trunk/sexpr/sexpr.rb
===================================================================
--- trunk/sexpr/sexpr.rb        2007-11-03 07:18:34 UTC (rev 3475)
+++ trunk/sexpr/sexpr.rb        2007-11-03 09:21:45 UTC (rev 3476)
@@ -15,6 +15,8 @@
 #  along with this program; if not, write to the Free Software
 #  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 
+require "parser.rb"
+
 module SExpr
 
   class SExpr
@@ -133,6 +135,10 @@
       return @value.empty?()
     end
 
+    def length()
+      return @value.length 
+    end
+
     def to_s()
       return "(" + @value.map{|i| i.to_s}.join(" ") + ")"
     end

Modified: trunk/sexpr/sexpr_test.rb
===================================================================
--- trunk/sexpr/sexpr_test.rb   2007-11-03 07:18:34 UTC (rev 3475)
+++ trunk/sexpr/sexpr_test.rb   2007-11-03 09:21:45 UTC (rev 3476)
@@ -8,7 +8,7 @@
 else
   ARGV.each{|filename|
     sexpr = SExpr::SExpr.parse(File.new(filename).read())
-    sexpr.each{|el|
+    sexpr.each{ |el|
       el.write($stdout)
     }
   }





reply via email to

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