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