rdparser 0.1.1 → 0.1.2
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +2 -0
- data/Rakefile +3 -3
- data/lib/rdparser.rb +4 -1
- data/lib/rdparser/rdparser.rb +17 -17
- data/lib/rdparser/version.rb +1 -1
- data/rdparser.gemspec +1 -0
- data/spec/exceptions_spec.rb +5 -0
- data/spec/parser_base_spec.rb +15 -0
- data/spec/support/parser_helper.rb +9 -0
- metadata +30 -18
- data/lib/rdparser/exceptions.rb +0 -4
data/.gitignore
CHANGED
data/Rakefile
CHANGED
@@ -29,12 +29,12 @@ end
|
|
29
29
|
|
30
30
|
task :spec => 'spec:progress'
|
31
31
|
|
32
|
-
desc 'Generate documentation for the
|
33
|
-
|
32
|
+
desc 'Generate documentation for the rdparser plugin.'
|
33
|
+
RDoc::Task.new(:rdoc) do |rdoc|
|
34
34
|
rdoc.rdoc_dir = 'rdoc'
|
35
35
|
rdoc.title = 'RDParser'
|
36
36
|
rdoc.options << '--line-numbers' << '--inline-source' << '--charset=UTF-8'
|
37
|
-
rdoc.rdoc_files.include('README')
|
37
|
+
#rdoc.rdoc_files.include('README')
|
38
38
|
rdoc.rdoc_files.include('lib/**/*.rb')
|
39
39
|
end
|
40
40
|
|
data/lib/rdparser.rb
CHANGED
@@ -3,7 +3,10 @@ require File.expand_path('../patches/array.rb', __FILE__)
|
|
3
3
|
|
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
|
9
|
+
|
7
10
|
autoload :RDParser, File.expand_path('../rdparser/rdparser.rb', __FILE__)
|
8
11
|
autoload :Scanner, File.expand_path('../rdparser/scanner.rb', __FILE__)
|
9
12
|
|
data/lib/rdparser/rdparser.rb
CHANGED
@@ -14,15 +14,15 @@ class RDParser::RDParser
|
|
14
14
|
@depth = -1
|
15
15
|
|
16
16
|
# Create a string scanner object based on the content
|
17
|
-
@content = RDParser::Scanner.new(content, :slurp_whitespace => !options[:manual_whitespace])
|
17
|
+
@content = ::RDParser::Scanner.new(content, :slurp_whitespace => !options[:manual_whitespace])
|
18
18
|
|
19
19
|
# Kick off the show by parsing from the rule specified
|
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 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::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?
|
24
24
|
|
25
|
-
|
25
|
+
[results].flatten
|
26
26
|
end
|
27
27
|
|
28
28
|
# Parse the content based on the rulesets for a particular grammar context
|
@@ -32,7 +32,7 @@ class RDParser::RDParser
|
|
32
32
|
|
33
33
|
# For each distinct set of rules within a ruleset, get parsing..
|
34
34
|
sub_rulesets(rule).each do |ruleset|
|
35
|
-
RDParser::DEBUG && debug_message("RULE SET : #{ruleset}")
|
35
|
+
::RDParser::DEBUG && debug_message("RULE SET : #{ruleset}")
|
36
36
|
|
37
37
|
# By default, we assume failure!
|
38
38
|
success = false
|
@@ -43,7 +43,7 @@ class RDParser::RDParser
|
|
43
43
|
|
44
44
|
# Go through each rule in this ruleset
|
45
45
|
sub_rules(ruleset).each do |r|
|
46
|
-
RDParser::DEBUG && debug_message("Running rule '#{r}' against '#{@content.lookahead}'")
|
46
|
+
::RDParser::DEBUG && debug_message("Running rule '#{r}' against '#{@content.lookahead}'")
|
47
47
|
suboutput = []
|
48
48
|
|
49
49
|
# Match a rule with 1 or more occurrences (e.g. "rule(s)")
|
@@ -95,22 +95,22 @@ class RDParser::RDParser
|
|
95
95
|
|
96
96
|
# We've either processed all the rules for this ruleset, or.. it failed
|
97
97
|
if success
|
98
|
-
RDParser::DEBUG && debug_message("Success of all rules in #{ruleset}")
|
98
|
+
::RDParser::DEBUG && debug_message("Success of all rules in #{ruleset}")
|
99
99
|
|
100
100
|
# No need to check any more rulesets! We've just passed one,
|
101
101
|
# so drop the depth a notch, we're headed back up the tree of recursion!
|
102
102
|
@depth -= 1
|
103
|
-
RDParser::DEBUG && debug_message("SUCCEED: #{ruleset}", :passback)
|
103
|
+
::RDParser::DEBUG && debug_message("SUCCEED: #{ruleset}", :passback)
|
104
104
|
return output
|
105
105
|
else
|
106
|
-
RDParser::DEBUG && debug_message("failed #{ruleset}.. moving on")
|
106
|
+
::RDParser::DEBUG && debug_message("failed #{ruleset}.. moving on")
|
107
107
|
|
108
108
|
# If the rule set failed, revert the position back to that we stored earlier
|
109
109
|
@content.rollback_to(was_position)
|
110
110
|
|
111
111
|
# And clean the output.. because any output we got from a broken rule is as useful
|
112
112
|
# as an ashtray on a motorbike, a chocolate teapot, or ice cutlery.
|
113
|
-
RDParser::DEBUG && debug_message("FAIL: #{ruleset}", :passback)
|
113
|
+
::RDParser::DEBUG && debug_message("FAIL: #{ruleset}", :passback)
|
114
114
|
end
|
115
115
|
end
|
116
116
|
|
@@ -121,7 +121,7 @@ class RDParser::RDParser
|
|
121
121
|
|
122
122
|
# Parse the content based on a single subrule
|
123
123
|
def match_for_rule(rule)
|
124
|
-
RDParser::DEBUG && debug_message("TRYING #{rule}")
|
124
|
+
::RDParser::DEBUG && debug_message("TRYING #{rule}")
|
125
125
|
output = []
|
126
126
|
rule_data = @grammar[rule]
|
127
127
|
|
@@ -129,7 +129,7 @@ class RDParser::RDParser
|
|
129
129
|
if rule.to_s =~ /^\"(.+)\"$/
|
130
130
|
m = $1
|
131
131
|
if @content.scan(m)
|
132
|
-
RDParser::DEBUG && debug_message("GOT #{m}")
|
132
|
+
::RDParser::DEBUG && debug_message("GOT #{m}")
|
133
133
|
output << {rule => m}
|
134
134
|
else
|
135
135
|
return false
|
@@ -139,7 +139,7 @@ class RDParser::RDParser
|
|
139
139
|
elsif rule_data.class == Regexp
|
140
140
|
# If we get a match.. do stuff!
|
141
141
|
if c = @content.scan(rule_data)
|
142
|
-
RDParser::DEBUG && debug_message("GOT IT --> #{c}")
|
142
|
+
::RDParser::DEBUG && debug_message("GOT IT --> #{c}")
|
143
143
|
output << {rule => c}
|
144
144
|
else
|
145
145
|
# If we get no match, go and cry to mommy^H^H^H^H^Hhead up the recursion ladder
|
@@ -154,11 +154,11 @@ class RDParser::RDParser
|
|
154
154
|
# But did it really work out as planned?
|
155
155
|
if response
|
156
156
|
# Yes.. so celebrate and process the response.
|
157
|
-
RDParser::DEBUG && debug_message("GOT #{rule}")
|
157
|
+
::RDParser::DEBUG && debug_message("GOT #{rule}")
|
158
158
|
return {rule => response}
|
159
159
|
else
|
160
160
|
# No.. so throw a hissyfit
|
161
|
-
RDParser::DEBUG && debug_message("NOT GOT #{rule}")
|
161
|
+
::RDParser::DEBUG && debug_message("NOT GOT #{rule}")
|
162
162
|
return false
|
163
163
|
end
|
164
164
|
end
|
@@ -174,7 +174,7 @@ class RDParser::RDParser
|
|
174
174
|
|
175
175
|
# A 'pretty printer' for RDParser's syntax trees (pp just doesn't cut it for these beasties)
|
176
176
|
# There's probably a nice iterative way of doing this but I'm tired.
|
177
|
-
def
|
177
|
+
def self.text_syntax_tree(v, depth = 0, output = '')
|
178
178
|
if v.class == Array
|
179
179
|
v.each { |a| output = text_syntax_tree(a, depth, output) }
|
180
180
|
elsif v.class == Hash
|
@@ -189,7 +189,7 @@ class RDParser::RDParser
|
|
189
189
|
# Prints a debugging message if debug mode is enabled
|
190
190
|
def debug_message(message, priority = true)
|
191
191
|
# Let's different types of message through
|
192
|
-
return if priority != RDParser::DEBUG
|
192
|
+
return if priority != ::RDParser::DEBUG
|
193
193
|
puts "#{(" " * @depth.to_i) if @depth && @depth > -1 } #{message}"
|
194
194
|
end
|
195
195
|
end
|
data/lib/rdparser/version.rb
CHANGED
data/rdparser.gemspec
CHANGED
@@ -11,6 +11,7 @@ Gem::Specification.new do |s|
|
|
11
11
|
s.description = "A Simple Recursive Descending (LL) Parser for Ruby"
|
12
12
|
s.rubyforge_project = "rdparser"
|
13
13
|
|
14
|
+
s.add_development_dependency "rdoc"
|
14
15
|
s.add_development_dependency "rake"
|
15
16
|
s.add_development_dependency "bundler"
|
16
17
|
s.add_development_dependency "rspec"
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require File.expand_path('../support/spec_helper.rb', __FILE__)
|
2
|
+
|
3
|
+
describe RDParser::RDParser do
|
4
|
+
context "given a very simple grammar" do
|
5
|
+
include ParserHelper
|
6
|
+
parser do |p|
|
7
|
+
p.expression '"a" expression1'
|
8
|
+
p.expression1 /^.*$/
|
9
|
+
end
|
10
|
+
|
11
|
+
it { should parse("asdf") }
|
12
|
+
it { should_not parse("qwer") }
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
@@ -16,8 +16,17 @@ module ParserHelper
|
|
16
16
|
def description
|
17
17
|
%{should parse "#{@_expression}" starting with :#{@_root}}
|
18
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
|
19
25
|
def matches? parser
|
20
26
|
parser.parse(@_root, @_expression).kind_of?(Array)
|
27
|
+
return true
|
28
|
+
rescue RDParser::ParserError
|
29
|
+
return false
|
21
30
|
end
|
22
31
|
end
|
23
32
|
o.instance_variable_set('@_expression', expression)
|
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.
|
4
|
+
version: 0.1.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -10,11 +10,22 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2011-12-
|
13
|
+
date: 2011-12-22 00:00:00.000000000Z
|
14
14
|
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: rdoc
|
17
|
+
requirement: &19621620 !ruby/object:Gem::Requirement
|
18
|
+
none: false
|
19
|
+
requirements:
|
20
|
+
- - ! '>='
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: '0'
|
23
|
+
type: :development
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: *19621620
|
15
26
|
- !ruby/object:Gem::Dependency
|
16
27
|
name: rake
|
17
|
-
requirement: &
|
28
|
+
requirement: &19621200 !ruby/object:Gem::Requirement
|
18
29
|
none: false
|
19
30
|
requirements:
|
20
31
|
- - ! '>='
|
@@ -22,10 +33,10 @@ dependencies:
|
|
22
33
|
version: '0'
|
23
34
|
type: :development
|
24
35
|
prerelease: false
|
25
|
-
version_requirements: *
|
36
|
+
version_requirements: *19621200
|
26
37
|
- !ruby/object:Gem::Dependency
|
27
38
|
name: bundler
|
28
|
-
requirement: &
|
39
|
+
requirement: &19620780 !ruby/object:Gem::Requirement
|
29
40
|
none: false
|
30
41
|
requirements:
|
31
42
|
- - ! '>='
|
@@ -33,10 +44,10 @@ dependencies:
|
|
33
44
|
version: '0'
|
34
45
|
type: :development
|
35
46
|
prerelease: false
|
36
|
-
version_requirements: *
|
47
|
+
version_requirements: *19620780
|
37
48
|
- !ruby/object:Gem::Dependency
|
38
49
|
name: rspec
|
39
|
-
requirement: &
|
50
|
+
requirement: &19620360 !ruby/object:Gem::Requirement
|
40
51
|
none: false
|
41
52
|
requirements:
|
42
53
|
- - ! '>='
|
@@ -44,10 +55,10 @@ dependencies:
|
|
44
55
|
version: '0'
|
45
56
|
type: :development
|
46
57
|
prerelease: false
|
47
|
-
version_requirements: *
|
58
|
+
version_requirements: *19620360
|
48
59
|
- !ruby/object:Gem::Dependency
|
49
60
|
name: simplecov
|
50
|
-
requirement: &
|
61
|
+
requirement: &19619940 !ruby/object:Gem::Requirement
|
51
62
|
none: false
|
52
63
|
requirements:
|
53
64
|
- - ! '>='
|
@@ -55,10 +66,10 @@ dependencies:
|
|
55
66
|
version: '0'
|
56
67
|
type: :development
|
57
68
|
prerelease: false
|
58
|
-
version_requirements: *
|
69
|
+
version_requirements: *19619940
|
59
70
|
- !ruby/object:Gem::Dependency
|
60
71
|
name: spork
|
61
|
-
requirement: &
|
72
|
+
requirement: &19619520 !ruby/object:Gem::Requirement
|
62
73
|
none: false
|
63
74
|
requirements:
|
64
75
|
- - ! '>='
|
@@ -66,10 +77,10 @@ dependencies:
|
|
66
77
|
version: '0'
|
67
78
|
type: :development
|
68
79
|
prerelease: false
|
69
|
-
version_requirements: *
|
80
|
+
version_requirements: *19619520
|
70
81
|
- !ruby/object:Gem::Dependency
|
71
82
|
name: watchr
|
72
|
-
requirement: &
|
83
|
+
requirement: &19619100 !ruby/object:Gem::Requirement
|
73
84
|
none: false
|
74
85
|
requirements:
|
75
86
|
- - ! '>='
|
@@ -77,7 +88,7 @@ dependencies:
|
|
77
88
|
version: '0'
|
78
89
|
type: :development
|
79
90
|
prerelease: false
|
80
|
-
version_requirements: *
|
91
|
+
version_requirements: *19619100
|
81
92
|
description: A Simple Recursive Descending (LL) Parser for Ruby
|
82
93
|
email:
|
83
94
|
- golda@bitandpixel.hu
|
@@ -91,12 +102,13 @@ files:
|
|
91
102
|
- Rakefile
|
92
103
|
- lib/patches/array.rb
|
93
104
|
- lib/rdparser.rb
|
94
|
-
- lib/rdparser/exceptions.rb
|
95
105
|
- lib/rdparser/rdparser.rb
|
96
106
|
- lib/rdparser/scanner.rb
|
97
107
|
- lib/rdparser/version.rb
|
98
108
|
- rdparser.gemspec
|
99
109
|
- spec/examples/a4_spec.rb
|
110
|
+
- spec/exceptions_spec.rb
|
111
|
+
- spec/parser_base_spec.rb
|
100
112
|
- spec/support/parser_helper.rb
|
101
113
|
- spec/support/spec_helper.rb
|
102
114
|
homepage: http://www.rubyinside.com/recursive-descent-parser-for-ruby-300.html
|
@@ -114,7 +126,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
114
126
|
version: '0'
|
115
127
|
segments:
|
116
128
|
- 0
|
117
|
-
hash:
|
129
|
+
hash: 534404727448102245
|
118
130
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
119
131
|
none: false
|
120
132
|
requirements:
|
@@ -123,11 +135,11 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
123
135
|
version: '0'
|
124
136
|
segments:
|
125
137
|
- 0
|
126
|
-
hash:
|
138
|
+
hash: 534404727448102245
|
127
139
|
requirements: []
|
128
140
|
rubyforge_project: rdparser
|
129
141
|
rubygems_version: 1.8.10
|
130
142
|
signing_key:
|
131
143
|
specification_version: 3
|
132
|
-
summary: rdparser-0.1.
|
144
|
+
summary: rdparser-0.1.2
|
133
145
|
test_files: []
|
data/lib/rdparser/exceptions.rb
DELETED