rdparser 0.1.2 → 0.2.0

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.
@@ -4,11 +4,11 @@ require File.expand_path('../patches/array.rb', __FILE__)
4
4
  # A Simple Recursive Descending (LL) Parser for Ruby
5
5
  module RDParser
6
6
 
7
- # raised when Parser cannot get through the entire string.
8
- class ParserError < StandardError; end
7
+ autoload :ParseError, File.expand_path('../rdparser/parse_error.rb', __FILE__)
8
+ autoload :RDParser, File.expand_path('../rdparser/rdparser.rb', __FILE__)
9
+ autoload :Scanner, File.expand_path('../rdparser/scanner.rb', __FILE__)
9
10
 
10
- autoload :RDParser, File.expand_path('../rdparser/rdparser.rb', __FILE__)
11
- autoload :Scanner, File.expand_path('../rdparser/scanner.rb', __FILE__)
11
+ autoload :ParseMatcher, File.expand_path('../rdparser/parse_matcher.rb', __FILE__)
12
12
 
13
13
  # change to true to get flooded with debug messages during parsing
14
14
  DEBUG = false
@@ -0,0 +1,9 @@
1
+ # raised when Parser cannot get through the entire string.
2
+ class RDParser::ParseError < StandardError
3
+ attr_reader :content, :position
4
+ def initialize content, position
5
+ super(%{Cannot parse the entire content! (error was on position ##{position}: "#{content[0...position]}|#{content[position..position]}|#{content[position+1..-1]}")})
6
+ @content = content
7
+ @position = position
8
+ end
9
+ end
@@ -0,0 +1,56 @@
1
+ module RDParser::ParseMatcher
2
+ class Parse
3
+ def initialize expression, root
4
+ @expression = expression
5
+ @root = root
6
+ end
7
+
8
+ def matches? parser
9
+ parser.parse(@root, @expression).kind_of?(Array)
10
+ return true
11
+ rescue RDParser::ParseError
12
+ @error_on_position = $!.position
13
+ @error_in_content = $!.content
14
+ return false
15
+ end
16
+
17
+ def failure_message
18
+ %{Grammar should parse "#{@expression}" starting with :#{@root} but error was catched on position #{@error_on_position}! "#{@expression[0...@error_on_position]}|#{@expression[@error_on_position..@error_on_position]}|#{@expression[@error_on_position+1..-1]}"}
19
+ end
20
+
21
+ def negative_failure_message
22
+ %{Grammar should not parse "#{@expression}" starting with :#{@root}} + (@expected_error_on_position && %{ and first error should appear on position #{@expected_error_on_position}} || '') + %{!}
23
+ end
24
+
25
+ def description
26
+ %{parse "#{@expression}" starting with :#{@root}} + (@expected_error_on_position && %{ and with first error on position #{@expected_error_on_position.to_s}} || '')
27
+ end
28
+
29
+ def with position
30
+ @expected_error_on_position = position
31
+ self
32
+ end
33
+ end
34
+
35
+ def self.included base
36
+ base.extend const_get("ClassMethods") if const_defined?("ClassMethods")
37
+ base.send :include, const_get("InstanceMethods") if const_defined?("InstanceMethods")
38
+ end
39
+
40
+ module ClassMethods
41
+ def parser &block
42
+ subject { RDParser::RDParser.new(&block) }
43
+ end
44
+ end
45
+
46
+ module InstanceMethods
47
+ def parse expression, root=:expression
48
+ RDParser::ParseMatcher::Parse.new expression, root
49
+ end
50
+
51
+ def error_on_position position
52
+ position
53
+ end
54
+ alias :first_error_on_position :error_on_position
55
+ end
56
+ end
@@ -20,7 +20,7 @@ class RDParser::RDParser
20
20
  results = parse_section(rule.to_sym)
21
21
 
22
22
  # Raises ParserError when cannot get parse the entire content and :partial is not set.
23
- raise ::RDParser::ParserError, %{Cannot parse the entire content! (error was on position ##{@content.position}: "#{content[0...@content.position]}|#{content[@content.position..@content.position]}|#{content[@content.position+1..-1]}")} unless options[:partial] == true or @content.eos?
23
+ raise RDParser::ParseError.new(content, @content.position) unless options[:partial] == true or @content.eos?
24
24
 
25
25
  [results].flatten
26
26
  end
@@ -1,3 +1,3 @@
1
1
  module RDParser
2
- VERSION = "0.1.2"
2
+ VERSION = "0.2.0"
3
3
  end
@@ -1,8 +1,6 @@
1
1
  require File.expand_path('../../support/spec_helper', __FILE__)
2
2
 
3
3
  describe 'A4::Authorization::Parser' do
4
- include ParserHelper
5
-
6
4
  parser do |p|
7
5
  p.expression 'expression_u binary expression | expression_u'
8
6
  p.expression_u 'unary expression_u | "(" expression ")" | role'
@@ -1,5 +1,5 @@
1
1
  require File.expand_path('../support/spec_helper.rb', __FILE__)
2
2
 
3
- describe "RDParser::ParserError" do
4
- it { expect{ RDParser::ParserError }.should_not raise_error }
3
+ describe "RDParser::ParseError" do
4
+ it { expect{ RDParser::ParseError }.should_not raise_error }
5
5
  end
@@ -1,15 +1,21 @@
1
1
  require File.expand_path('../support/spec_helper.rb', __FILE__)
2
2
 
3
- describe RDParser::RDParser do
3
+ describe RDParser::RDParser, :focused => true do
4
4
  context "given a very simple grammar" do
5
- include ParserHelper
6
5
  parser do |p|
7
6
  p.expression '"a" expression1'
8
- p.expression1 /^.*$/
7
+ p.expression1 '"s" expression2'
8
+ p.expression2 /^.*$/
9
9
  end
10
10
 
11
+ # TODO test failed messages somehow -- cucumber?
12
+ #it { should_not parse("asdf").with error_on_position(1) }
13
+ #it { should_not parse("asdf") }
14
+ #it { should parse("qwer") }
15
+
11
16
  it { should parse("asdf") }
12
17
  it { should_not parse("qwer") }
18
+ it { should_not parse("awer").with error_on_position(1) }
13
19
  end
14
20
  end
15
21
 
@@ -13,5 +13,6 @@ RSpec.configure do |config|
13
13
  config.alias_it_should_behave_like_to(:it_should_behave_like, '')
14
14
  config.filter_run :focused => true
15
15
  config.run_all_when_everything_filtered = true
16
+ include RDParser::ParseMatcher
16
17
  end
17
18
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rdparser
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.2.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -10,11 +10,11 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2011-12-22 00:00:00.000000000Z
13
+ date: 2012-01-27 00:00:00.000000000Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: rdoc
17
- requirement: &19621620 !ruby/object:Gem::Requirement
17
+ requirement: &28082060 !ruby/object:Gem::Requirement
18
18
  none: false
19
19
  requirements:
20
20
  - - ! '>='
@@ -22,10 +22,10 @@ dependencies:
22
22
  version: '0'
23
23
  type: :development
24
24
  prerelease: false
25
- version_requirements: *19621620
25
+ version_requirements: *28082060
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: rake
28
- requirement: &19621200 !ruby/object:Gem::Requirement
28
+ requirement: &28081640 !ruby/object:Gem::Requirement
29
29
  none: false
30
30
  requirements:
31
31
  - - ! '>='
@@ -33,10 +33,10 @@ dependencies:
33
33
  version: '0'
34
34
  type: :development
35
35
  prerelease: false
36
- version_requirements: *19621200
36
+ version_requirements: *28081640
37
37
  - !ruby/object:Gem::Dependency
38
38
  name: bundler
39
- requirement: &19620780 !ruby/object:Gem::Requirement
39
+ requirement: &28081220 !ruby/object:Gem::Requirement
40
40
  none: false
41
41
  requirements:
42
42
  - - ! '>='
@@ -44,10 +44,10 @@ dependencies:
44
44
  version: '0'
45
45
  type: :development
46
46
  prerelease: false
47
- version_requirements: *19620780
47
+ version_requirements: *28081220
48
48
  - !ruby/object:Gem::Dependency
49
49
  name: rspec
50
- requirement: &19620360 !ruby/object:Gem::Requirement
50
+ requirement: &28080800 !ruby/object:Gem::Requirement
51
51
  none: false
52
52
  requirements:
53
53
  - - ! '>='
@@ -55,10 +55,10 @@ dependencies:
55
55
  version: '0'
56
56
  type: :development
57
57
  prerelease: false
58
- version_requirements: *19620360
58
+ version_requirements: *28080800
59
59
  - !ruby/object:Gem::Dependency
60
60
  name: simplecov
61
- requirement: &19619940 !ruby/object:Gem::Requirement
61
+ requirement: &28080380 !ruby/object:Gem::Requirement
62
62
  none: false
63
63
  requirements:
64
64
  - - ! '>='
@@ -66,10 +66,10 @@ dependencies:
66
66
  version: '0'
67
67
  type: :development
68
68
  prerelease: false
69
- version_requirements: *19619940
69
+ version_requirements: *28080380
70
70
  - !ruby/object:Gem::Dependency
71
71
  name: spork
72
- requirement: &19619520 !ruby/object:Gem::Requirement
72
+ requirement: &28079960 !ruby/object:Gem::Requirement
73
73
  none: false
74
74
  requirements:
75
75
  - - ! '>='
@@ -77,10 +77,10 @@ dependencies:
77
77
  version: '0'
78
78
  type: :development
79
79
  prerelease: false
80
- version_requirements: *19619520
80
+ version_requirements: *28079960
81
81
  - !ruby/object:Gem::Dependency
82
82
  name: watchr
83
- requirement: &19619100 !ruby/object:Gem::Requirement
83
+ requirement: &28079540 !ruby/object:Gem::Requirement
84
84
  none: false
85
85
  requirements:
86
86
  - - ! '>='
@@ -88,7 +88,7 @@ dependencies:
88
88
  version: '0'
89
89
  type: :development
90
90
  prerelease: false
91
- version_requirements: *19619100
91
+ version_requirements: *28079540
92
92
  description: A Simple Recursive Descending (LL) Parser for Ruby
93
93
  email:
94
94
  - golda@bitandpixel.hu
@@ -102,6 +102,8 @@ files:
102
102
  - Rakefile
103
103
  - lib/patches/array.rb
104
104
  - lib/rdparser.rb
105
+ - lib/rdparser/parse_error.rb
106
+ - lib/rdparser/parse_matcher.rb
105
107
  - lib/rdparser/rdparser.rb
106
108
  - lib/rdparser/scanner.rb
107
109
  - lib/rdparser/version.rb
@@ -109,7 +111,6 @@ files:
109
111
  - spec/examples/a4_spec.rb
110
112
  - spec/exceptions_spec.rb
111
113
  - spec/parser_base_spec.rb
112
- - spec/support/parser_helper.rb
113
114
  - spec/support/spec_helper.rb
114
115
  homepage: http://www.rubyinside.com/recursive-descent-parser-for-ruby-300.html
115
116
  licenses: []
@@ -126,7 +127,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
126
127
  version: '0'
127
128
  segments:
128
129
  - 0
129
- hash: 534404727448102245
130
+ hash: -288882667666033840
130
131
  required_rubygems_version: !ruby/object:Gem::Requirement
131
132
  none: false
132
133
  requirements:
@@ -135,11 +136,11 @@ required_rubygems_version: !ruby/object:Gem::Requirement
135
136
  version: '0'
136
137
  segments:
137
138
  - 0
138
- hash: 534404727448102245
139
+ hash: -288882667666033840
139
140
  requirements: []
140
141
  rubyforge_project: rdparser
141
142
  rubygems_version: 1.8.10
142
143
  signing_key:
143
144
  specification_version: 3
144
- summary: rdparser-0.1.2
145
+ summary: rdparser-0.2.0
145
146
  test_files: []
@@ -1,37 +0,0 @@
1
- module ParserHelper
2
- def self.included base
3
- base.extend const_get("ClassMethods") if const_defined?("ClassMethods")
4
- base.send :include, const_get("InstanceMethods") if const_defined?("InstanceMethods")
5
- end
6
-
7
- module ClassMethods
8
- def parser &block
9
- subject { RDParser::RDParser.new(&block) }
10
- end
11
- end
12
-
13
- module InstanceMethods
14
- def parse expression, root=:expression
15
- class << (o=Object.new)
16
- def description
17
- %{should parse "#{@_expression}" starting with :#{@_root}}
18
- end
19
- def failure_message
20
- %{Grammar should parse "#{@_expression}"!}
21
- end
22
- def negative_failure_message
23
- %{Grammar should not parse "#{@_expression}"!}
24
- end
25
- def matches? parser
26
- parser.parse(@_root, @_expression).kind_of?(Array)
27
- return true
28
- rescue RDParser::ParserError
29
- return false
30
- end
31
- end
32
- o.instance_variable_set('@_expression', expression)
33
- o.instance_variable_set('@_root', root)
34
- o
35
- end
36
- end
37
- end