kaiseki 1.0.9 → 1.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/lib/kaiseki.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  module Kaiseki
2
- VERSION = '1.0.9'
2
+ VERSION = '1.1.1'
3
3
  file_path = File.dirname __FILE__
4
4
 
5
5
  #load basic kaiseki classes
@@ -41,6 +41,8 @@ module Kaiseki
41
41
  require file_path + '/result_merge'
42
42
  require file_path + '/result_cast'
43
43
  require file_path + '/result_filter'
44
+ require file_path + '/result_action'
45
+ require file_path + '/result_validate'
44
46
  require file_path + '/node'
45
47
 
46
48
  #load grammar classes
data/lib/parseable.rb CHANGED
@@ -74,6 +74,14 @@ module Kaiseki
74
74
  FilterResult.new self, node, &block
75
75
  end
76
76
 
77
+ def action node = Node.default, &block
78
+ ActionResult.new self, node, &block
79
+ end
80
+
81
+ def validate validators
82
+ ValidateResult.new self, validators
83
+ end
84
+
77
85
  def set *vars
78
86
  SetVar.new self, *vars
79
87
  end
@@ -0,0 +1,23 @@
1
+ module Kaiseki
2
+ class ActionResult < FilterResult
3
+ def parse! stream, options = {}
4
+ if @node.is_a? Class
5
+ node_class = @node
6
+ else
7
+ if options[:grammar]
8
+ node_class = options[:grammar].nodes[@node]
9
+ else
10
+ raise "can't use named nodes without a grammar"
11
+ end
12
+ end
13
+ result = @expected.parse stream, options
14
+ if result.is_a? Array
15
+ node = node_class.new result, options[:global]
16
+ else
17
+ node = node_class.new [result]
18
+ end
19
+ node.eval options[:global], &@block
20
+ result
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,38 @@
1
+ module Kaiseki
2
+ class ValidateResult < PackageParser
3
+ attr_reader :validators
4
+
5
+ def initialize expected, validators
6
+ super expected
7
+ @validators = validators
8
+ end
9
+
10
+ def parse! stream, options = {}
11
+ result = @expected.parse stream, options
12
+ passed = true
13
+ @validators.each do |key, value|
14
+ case key
15
+ when :includes
16
+ passed = false unless value.find {|n| n === result }
17
+ when :excludes
18
+ passed = false if value.find {|n| n === result }
19
+ when :is
20
+ passed = false unless value.member? result
21
+ when :not
22
+ passed = false if value.member? result
23
+ end
24
+ end
25
+ if passed
26
+ result
27
+ else
28
+ raise ParseError.new "`#{result}' does not pass validation", options
29
+ end
30
+ end
31
+
32
+ def eql? other
33
+ other.is_a?(self.class) and other.expected == @expected and other.validators == @validators
34
+ end
35
+
36
+ alias :== :eql?
37
+ end
38
+ end
data/lib/rule.rb CHANGED
@@ -78,6 +78,25 @@ module Kaiseki
78
78
  end
79
79
  end
80
80
 
81
+ def action node = @name, &block
82
+ if @parseable
83
+ unless @grammar.nodes.key? @name
84
+ @grammar.nodes[@name] = Node.default
85
+ end
86
+ @parseable = @parseable.action node, &block
87
+ else
88
+ raise "parseable for rule #{@name.inspect} undefined"
89
+ end
90
+ end
91
+
92
+ def validates validators
93
+ if @parseable
94
+ @parseable = @parseable.validate validators
95
+ else
96
+ raise "parseable for rule #{@name.inspect} undefined"
97
+ end
98
+ end
99
+
81
100
  def node args, options = {}
82
101
  args.must_be Array
83
102
  if @grammar.nodes.key? @name
metadata CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
4
4
  prerelease: false
5
5
  segments:
6
6
  - 1
7
- - 0
8
- - 9
9
- version: 1.0.9
7
+ - 1
8
+ - 1
9
+ version: 1.1.1
10
10
  platform: ruby
11
11
  authors:
12
12
  - William Hamilton-Levi
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2011-01-23 00:00:00 -05:00
17
+ date: 2011-01-24 00:00:00 -05:00
18
18
  default_executable:
19
19
  dependencies: []
20
20
 
@@ -54,8 +54,10 @@ files:
54
54
  - lib/mod_symbol.rb
55
55
  - lib/parser_custom.rb
56
56
  - lib/parser_eof.rb
57
+ - lib/result_validate.rb
57
58
  - lib/parse_result.rb
58
59
  - lib/parser_symbol.rb
60
+ - lib/result_action.rb
59
61
  - lib/mod_proc.rb
60
62
  - lib/grammar.rb
61
63
  - lib/parser_basic.rb