pingus-cvs
[Top][All Lists]
Advanced

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

[Pingus-CVS] r3495 - trunk/sexpr


From: grumbel at BerliOS
Subject: [Pingus-CVS] r3495 - trunk/sexpr
Date: Mon, 5 Nov 2007 13:15:41 +0100

Author: grumbel
Date: 2007-11-05 13:15:34 +0100 (Mon, 05 Nov 2007)
New Revision: 3495

Added:
   trunk/sexpr/grep.rb
   trunk/sexpr/input-syntax.scm
Modified:
   trunk/sexpr/reader.rb
   trunk/sexpr/schema.rb
Log:
- added simple grep-like tool
- started input-syntax file

Added: trunk/sexpr/grep.rb
===================================================================
--- trunk/sexpr/grep.rb 2007-11-04 22:54:31 UTC (rev 3494)
+++ trunk/sexpr/grep.rb 2007-11-05 12:15:34 UTC (rev 3495)
@@ -0,0 +1,27 @@
+#!/usr/bin/ruby -w
+
+require "sexpr.rb"
+require "parser.rb"
+require "schema.rb"
+
+if ARGV.length < 2 then
+  puts "Usage: grep.rb EXPRESSION FILES..."
+else
+  expression = ARGV[0].split
+  ARGV[1..-1].each{|i|
+    begin
+      reader = SExpr::Reader.parse(File.new(i).read())
+      results = reader.find_many(expression)
+      if not results.empty? then
+        results.each{|result|
+          puts "#{i}:#{result.pos}: #{result.to_sexpr}"
+        }
+      end
+    rescue RuntimeError
+      puts "#{i}:#{$!}"
+    end
+  }
+end
+
+# EOF #
+


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

Added: trunk/sexpr/input-syntax.scm
===================================================================
--- trunk/sexpr/input-syntax.scm        2007-11-04 22:54:31 UTC (rev 3494)
+++ trunk/sexpr/input-syntax.scm        2007-11-05 12:15:34 UTC (rev 3495)
@@ -0,0 +1,30 @@
+;; -*- scheme -*-
+
+(element (name "pingus-controller")
+  (use  "required")
+  (type (mapping
+         (children
+          (element (name "standard-keyboard")  (type (any)))
+          (element (name "standard-pointer")   (type (any)))
+          (element (name "standard-scroller")  (type (any)))
+          (element (name "primary-button")     (type (any)))
+          (element (name "secondary-button")   (type (any)))
+          (element (name "pause-button")       (type (any)))
+          (element (name "fast-forward-button") (type (any)))
+          (element (name "armageddon-button") (type (any)))
+          (element (name "escape-button") (type (any)))
+          (element (name "action-up-button")   (type (any)))
+          (element (name "action-down-button") (type (any)))
+          (element (name "action-1-button")    (type (any)))
+          (element (name "action-2-button")    (type (any)))
+          (element (name "action-3-button")    (type (any)))
+          (element (name "action-4-button")    (type (any)))
+          (element (name "action-5-button")    (type (any)))
+          (element (name "action-6-button")    (type (any)))
+          (element (name "action-7-button")    (type (any)))
+          (element (name "action-8-button")    (type (any)))
+          (element (name "action-9-button")    (type (any)))
+          (element (name "action-10-button")   (type (any)))
+          ))))
+
+;; EOF ;;

Modified: trunk/sexpr/reader.rb
===================================================================
--- trunk/sexpr/reader.rb       2007-11-04 22:54:31 UTC (rev 3494)
+++ trunk/sexpr/reader.rb       2007-11-05 12:15:34 UTC (rev 3495)
@@ -28,7 +28,7 @@
       end
     end
     
-    attr_reader :name, :pos
+    attr_reader :name, :pos, :root
 
     def initialize(sexpr)
       if not sexpr.is_a?(List) then
@@ -36,12 +36,45 @@
       elsif sexpr.length() == 0 then
         raise "#{sexpr.pos}: Error: Reader expected List with one or more 
elements"
       else
+        @root  = sexpr
         @name  = sexpr[0].value
         @pos   = sexpr[0].pos
         @sexpr = sexpr[1..-1]
       end        
     end
 
+    def find_many(path)
+      if path.empty? then
+        raise "find_by_path: path must not be empty"
+      else
+        elements = []
+
+        # Find all matching elements
+        @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 == path[0] then
+              elements << Reader.new(el)
+            end
+          end
+        }
+
+        if path.length == 1 then
+          return elements.map{|reader| reader.root}
+        else
+          # Do recursive step
+          elements.each{|reader|
+            return reader.find_many(path[1..-1])
+          }
+        end
+      end
+    end
+
     def find_by_path(path)
       if path.empty? then
         raise "find_by_path: path must not be empty"

Modified: trunk/sexpr/schema.rb
===================================================================
--- trunk/sexpr/schema.rb       2007-11-04 22:54:31 UTC (rev 3494)
+++ trunk/sexpr/schema.rb       2007-11-05 12:15:34 UTC (rev 3495)
@@ -20,7 +20,7 @@
 require "parser.rb"
 
 module SExpr
-
+  
   class Schema
     def initialize(schema)
       if schema.is_a?(SExpr) then
@@ -57,28 +57,28 @@
     def Schema.type_factory(reader)
       case reader.name
       when "mapping"
-          return MappingType.new(reader)
-          
+        return MappingType.new(reader)
+        
       when "sequence"
-          return SequenceType.new(reader)
+        return SequenceType.new(reader)
 
       when "choice"
-          return SequencType.new(reader)
-          
+        return SequencType.new(reader)
+        
       when "integer"
-          return IntegerType.new(reader)
+        return IntegerType.new(reader)
         
       when "real"
-          return RealType.new(reader)
+        return RealType.new(reader)
         
       when "boolean"
-          return BooleanType.new(reader)
+        return BooleanType.new(reader)
 
       when "string"
-          return StringType.new(reader)
+        return StringType.new(reader)
 
       when "symbol"
-          return SymbolType.new(reader)
+        return SymbolType.new(reader)
 
       when "vector2i"
         return Vector2iType.new(reader)
@@ -93,20 +93,20 @@
         return SurfaceType.new(reader)
 
       when "color"
-          return ColorType.new(reader)
+        return ColorType.new(reader)
 
       when "enumeration"
-          return EnumerationType.new(reader)
+        return EnumerationType.new(reader)
 
       when "any"
-          return AnyType.new(reader)
+        return AnyType.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
@@ -148,7 +148,7 @@
       end
     end
   end
-
+  
   class AnyType
     def initialize(reader)
     end
@@ -157,7 +157,7 @@
       Schema.report "#{sexprlst.pos}: AnyType: #{sexprlst.parent.to_sexpr}"
     end
   end
-
+  
   class SymbolType
     def initialize(reader)
     end
@@ -174,7 +174,7 @@
       end
     end
   end
-
+  
   class StringType
     def initialize(reader)
     end
@@ -191,7 +191,7 @@
       end
     end
   end
-
+  
   class BooleanType
     def initialize(reader)
     end
@@ -201,14 +201,14 @@
         Schema.report "#{sexprlst.pos}: expected a single boolean got 
#{sexprlst.to_s}"
       else
         if not sexprlst[0].is_a?(Boolean) then
-          Schema.report "#{sexprlst.pos}: expected Boolean got 
#{sexprlst[0].class}"
+          Schema.report "#{sexprlst.pos}: expected Boolean got 
#{sexprlst[0].to_sexpr}"
         else
           # ok
         end
       end
     end
   end
-
+  
   class EnumerationType
     def initialize(reader)
       @values = reader.read_string_array("values")
@@ -233,7 +233,7 @@
       end      
     end
   end
-
+  
   class Vector2iType
     def initialize(reader)
     end
@@ -250,7 +250,7 @@
       end
     end
   end
-
+  
   class Vector3iType
     def initialize(reader)
     end
@@ -270,7 +270,7 @@
       end
     end
   end
-
+  
   class SizeType
     def initialize(reader)
     end
@@ -284,11 +284,12 @@
         elsif sexprlst[0].value < 0 or sexprlst[1].value < 0 then
           Schema.report "#{sexprlst.pos}: size values must be >= 0: got 
#{sexprlst.to_sexpr}"
         else
+          # ok
         end
       end      
     end
   end
-
+  
   class ColorType
     def initialize(reader)
     end
@@ -314,7 +315,7 @@
       end
     end
   end
-
+  
   class SurfaceType
     def initialize(reader)
     end
@@ -322,7 +323,7 @@
     def validate(sexprlst)
     end
   end
-
+  
   class IntegerType
     def initialize(reader)
       # FIXME: add min/max and other possible range restrictions here
@@ -348,7 +349,7 @@
       end
     end
   end
-
+  
   class RealType
     def initialize(reader)
       @min = reader.read_real("min")
@@ -374,7 +375,7 @@
       end
     end
   end
-
+  
   # A list of ((key value) ...) 
   class MappingType
     def initialize(reader)
@@ -395,8 +396,9 @@
       }
     end
   end
-  
-  # A list of other elements ((foo 5) (bar 10) (baz "foo") ...)
+  
+  # A list of elements, duplicates are allowed, optional items are possible
+  # ((foo 5) (bar 10) (baz "foo") ...)
   class SequenceType
     def initialize(reader)
       @children = reader.read_section("children").sections.map{|el| 
Element.new(el) }
@@ -413,21 +415,34 @@
       }
     end
   end
-
+  
   class ChoiceType
     def initialize(reader)
       @children = reader.read_section("children").sections.map{|el| 
Element.new(el) }
-    end    
+    end
 
     def validate(sexpr)
       if sexpr.length() == 1 then
-        # sexpr[0]
+        if not sexpr[0].is_a?(List) then
+          Schema.report "#{sexpr.pos}: expected List, got #{sexpr.to_sexpr}"
+        elsif not sexpr[0].empty? then
+          Schema.report "#{sexpr.pos}: expected List, got #{sexpr.to_sexpr}"
+        elsif not sexpr[0][0].is_a?(Symbol) then
+          Schema.report "#{sexpr.pos}: expected Symbol as first element, got 
#{sexpr.to_sexpr}"
+        else
+          el = @children.find{ |el| sexpr[0][0].value == el.name }
+          if not el then
+            Schema.report "#{sexpr.pos}: invalid child element: 
#{sexpr[0].to_sexpr}"
+          else
+            # everything ok
+          end
+        end
       else
         Schema.report "Expected exactly one subtag" 
       end
     end
   end
-
+  
 end
 
 # EOF #





reply via email to

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