[Top][All Lists]
[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 #
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Pingus-CVS] r3495 - trunk/sexpr,
grumbel at BerliOS <=