[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Pingus-CVS] r3483 - trunk/sexpr
From: |
grumbel at BerliOS |
Subject: |
[Pingus-CVS] r3483 - trunk/sexpr |
Date: |
Sun, 4 Nov 2007 10:33:37 +0100 |
Author: grumbel
Date: 2007-11-04 10:33:37 +0100 (Sun, 04 Nov 2007)
New Revision: 3483
Modified:
trunk/sexpr/level-syntax.scm
trunk/sexpr/parser.rb
trunk/sexpr/schema.rb
trunk/sexpr/schema_test.rb
trunk/sexpr/sexpr.rb
Log:
- some more validator work
Modified: trunk/sexpr/level-syntax.scm
===================================================================
--- trunk/sexpr/level-syntax.scm 2007-11-04 08:18:48 UTC (rev 3482)
+++ trunk/sexpr/level-syntax.scm 2007-11-04 09:33:37 UTC (rev 3483)
@@ -4,29 +4,30 @@
(use "required")
(type (mapping
(children
- (element (name "version") (type (int)))
+ (element (name "version") (type (integer)))
(element (name "head")
(type (mapping
(children
(element (name "levelname") (type (string)))
(element (name "description") (type (string)))
(element (name "author") (type (string)))
- (element (name "number-of-pingus") (type (int)))
- (element (name "number-to-save") (type (int)))
- (element (name "time") (type (int)))
- (element (name "difficulty") (type (int)))
- (element (name "playable") (type (int)))
+ (element (name "number-of-pingus") (type (integer)))
+ (element (name "number-to-save") (type (integer)))
+ (element (name "levelsize") (type (size)))
+ (element (name "time") (type (integer)))
+ (element (name "difficulty") (type (integer)))
+ (element (name "playable") (type (integer)))
(element (name "comment") (type (string)))
(element (name "music") (type (string)))
(element (name "actions")
(type (mapping
(children
- (element (name "basher") (type (int (min 1))))
- (element (name "blocker") (type (int (min 1))))
- (element (name "bomber") (type (int (min 1))))
- (element (name "bridger") (type (int (min 1))))
- (element (name "climber") (type (int (min 1))))
- (element (name "jumper") (type (int (min 1))))
+ (element (name "basher") (type (integer (min
1))) (use "optional"))
+ (element (name "blocker") (type (integer (min
1))) (use "optional"))
+ (element (name "bomber") (type (integer (min
1))) (use "optional"))
+ (element (name "bridger") (type (integer (min
1))) (use "optional"))
+ (element (name "climber") (type (integer (min
1))) (use "optional"))
+ (element (name "jumper") (type (integer (min
1))) (use "optional"))
))))
))))
(element (name "objects")
@@ -43,7 +44,37 @@
(children
(element (name "position") (type (vector2i)))
(element (name "surface") (type (surface)))
- (element (name "release-rate") (type (int)))))))
+ (element (name "release-rate") (type
(integer)))))))
+
+ (element (name "surface-background")
+ (type (mapping
+ (children
+ (element (name "position") (type (vector2i)))
+ (element (name "surface") (type (surface)))))))
+
+ (element (name "liquid")
+ (type (mapping
+ (children
+ (element (name "position") (type (vector2i)))
+ (element (name "surface") (type (surface)))))))
+
+ (element (name "hotspot")
+ (type (mapping
+ (children
+ (element (name "position") (type (vector2i)))
+ (element (name "surface") (type (surface)))))))
+
+
+ (element (name "exit")
+ (type (mapping
+ (children
+ (element (name "position") (type (vector2i)))
+ (element (name "surface") (type (surface)))))))
+
+ (element (name "entrance")
+ (type (mapping
+ (children
+ (element (name "position") (type
(vector2i)))))))
))))
))))
Modified: trunk/sexpr/parser.rb
===================================================================
--- trunk/sexpr/parser.rb 2007-11-04 08:18:48 UTC (rev 3482)
+++ trunk/sexpr/parser.rb 2007-11-04 09:33:37 UTC (rev 3483)
@@ -220,10 +220,6 @@
end
end
- def get_pos()
- return "@line:@column"
- end
-
def submit(type, include_current_character)
@state = :look_for_token
@@ -235,41 +231,44 @@
@token_start = @pos
@advance = false
end
-
+
+ # FIXME: This refers to the end of the token, not the start
+ pretty_pos = "address@hidden:address@hidden"
+
case type
when :boolean
- @tokens << Boolean.new(current_token == "#t", get_pos())
+ @tokens << Boolean.new(current_token == "#t", pretty_pos)
when :integer
- @tokens << Integer.new(current_token.to_i, get_pos())
+ @tokens << Integer.new(current_token.to_i, pretty_pos)
when :real
- @tokens << Real.new(current_token.to_f, get_pos())
+ @tokens << Real.new(current_token.to_f, pretty_pos)
when :string
@tokens << String.new(current_token[1..-2].
gsub("\\n", "\n").
gsub("\\\"", "\"").
gsub("\\t", "\t"),
- get_pos())
+ pretty_pos)
when :symbol
- @tokens << Symbol.new(current_token, get_pos())
+ @tokens << Symbol.new(current_token, pretty_pos)
when :list_start
- @tokens << [:list_start, get_pos()]
+ @tokens << [:list_start, pretty_pos]
when :list_end
- @tokens << [:list_end, get_pos()]
+ @tokens << [:list_end, pretty_pos]
when :comment
if @parse_comments then
- @tokens << Comment.new(current_token, get_pos())
+ @tokens << Comment.new(current_token, pretty_pos)
end
when :whitespace
if @parse_whitespace then
- @tokens << Whitespace.new(current_token, get_pos())
+ @tokens << Whitespace.new(current_token, pretty_pos)
end
else
Modified: trunk/sexpr/schema.rb
===================================================================
--- trunk/sexpr/schema.rb 2007-11-04 08:18:48 UTC (rev 3482)
+++ trunk/sexpr/schema.rb 2007-11-04 09:33:37 UTC (rev 3483)
@@ -50,34 +50,46 @@
@root.validate(sexpr)
end
- def type_factor(reader)
+ def Schema.type_factory(reader)
case reader.name
- when "mapping":
+ when "mapping"
return MappingType.new(reader)
- when "sequence":
+ when "sequence"
return SequenceType.new(reader)
- when "choice":
+ when "choice"
return SequencType.new(reader)
- when "integer":
+ when "integer"
return IntegerType.new(reader)
- when "real":
+ when "real"
return RealType.new(reader)
- when "boolean":
+ when "boolean"
return BooleanType.new(reader)
- when "string":
+ when "string"
return StringType.new(reader)
- when "symbol":
+ when "symbol"
return SymbolType.new(reader)
- else:
- raise "#{reader.pos}: Unknown Type '#{reader.name}'"
+ when "vector2i"
+ return Vector2iType.new(reader)
+
+ when "size"
+ return Vector2iType.new(reader)
+
+ when "surface"
+ return SurfaceType.new(reader)
+
+ when "any"
+ return AnyType.new(reader)
+
+ else
+ raise "#{reader.pos}: unknown type '#{reader.name}'"
end
end
end # Schema
@@ -108,7 +120,7 @@
if sexpr[0].value != @name then
raise "#{sexpr.pos}: expected symbol '#{name}', got
#{sexpr[0].value}"
else
- puts "ok: address@hidden"
+ puts "Element ok: address@hidden"
# ok, now check type and/or validate children
type.validate(sexpr[1..-1])
end
@@ -118,6 +130,11 @@
end
end
+ class AnyType
+ def initialize(reader)
+ end
+ end
+
class SymbolType
def initialize(reader)
end
@@ -126,14 +143,39 @@
class StringType
def initialize(reader)
end
+
+ def validate(element)
+ end
end
+ class Vector2iType
+ def initialize(reader)
+ end
+
+ def validate(element)
+ end
+ end
+
+ class ColorType
+ def initialize(reader)
+ end
+ end
+
+ class SurfaceType
+ def initialize(reader)
+ end
+ end
+
class IntegerType
+ def initialize(reader)
+ # FIXME: add min/max and other possible range restrictions here
+ end
+
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
+ if not sexpr[0].is_a?(Integer) then
raise "#{sexpr.pos}: expected integer got #{sexpr[0].class}"
else
# ok
@@ -173,10 +215,12 @@
def validate(sexpr)
sexpr.each{ |el|
- if not check(el[0].value) then
+ child = @children.find{|i| i.name == el[0].value } # FIXME: Works, but
why? Shouldn't String and Symbol clash
+ if not child then
raise "#{el.pos}: invalid element '#{el[0].value}'"
else
- puts "ok: #{el[0].value}"
+ puts "MappingType Child: ok: #{el[0].value} #{child}"
+ child.validate(el)
end
}
end
@@ -189,12 +233,18 @@
end
def check_element(name)
-
+ puts "SequenceType: #{name}"
+ el = @children.find{|i| i.name == name.value }
+ if not el then
+ raise "#{name.pos}: SequenceType: element '#{name}' not allowed"
+ else
+ # ok
+ end
end
def validate(sexpr) # sexpr == SExpr::List
sexpr.each{ |el|
-
+ check_element(el[0])
}
end
end
Modified: trunk/sexpr/schema_test.rb
===================================================================
--- trunk/sexpr/schema_test.rb 2007-11-04 08:18:48 UTC (rev 3482)
+++ trunk/sexpr/schema_test.rb 2007-11-04 09:33:37 UTC (rev 3483)
@@ -4,13 +4,17 @@
require "parser.rb"
require "schema.rb"
-if ARGV.length != 2 then
- puts "Usage: schema_test.rb SCHEMAFILE SCMFILE"
-else
- schema = SExpr::Schema.new(File.new(ARGV[0]).read())
- sexpr = SExpr::SExpr.parse(File.new(ARGV[1]).read())
- # puts schema.inspect
- schema.validate(sexpr[0])
+begin
+ if ARGV.length != 2 then
+ puts "Usage: schema_test.rb SCHEMAFILE SCMFILE"
+ else
+ schema = SExpr::Schema.new(File.new(ARGV[0]).read())
+ sexpr = SExpr::SExpr.parse(File.new(ARGV[1]).read())
+ # puts schema.inspect
+ schema.validate(sexpr[0])
+ end
+rescue RuntimeError
+ puts "#{ARGV[1]}:#{$!}"
end
# EOF #
Modified: trunk/sexpr/sexpr.rb
===================================================================
--- trunk/sexpr/sexpr.rb 2007-11-04 08:18:48 UTC (rev 3482)
+++ trunk/sexpr/sexpr.rb 2007-11-04 09:33:37 UTC (rev 3483)
@@ -110,7 +110,7 @@
def initialize(value, pos = nil)
super(pos)
- @value = value
+ @value = value # FIXME: Is this supposed to be a String or Symbol?
end
def to_s()
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Pingus-CVS] r3483 - trunk/sexpr,
grumbel at BerliOS <=