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