minival_refi 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,159 @@
1
+ # encoding: UTF-8
2
+
3
+ grammar MinivalGrammar
4
+
5
+ rule val
6
+ spaces inner:val_inner spaces {
7
+ def content
8
+ return inner.content
9
+ end
10
+ def get_inner
11
+ return inner
12
+ end
13
+ }
14
+ end
15
+
16
+ rule spaces
17
+ ' '*
18
+ end
19
+
20
+ rule val_inner
21
+ nil / ary / map / str / regex / sym / float / fixnum
22
+ end
23
+
24
+ rule nil
25
+ 'nil' {
26
+ def content
27
+ return nil
28
+ end
29
+ }
30
+ end
31
+
32
+ rule ary
33
+ '[' spaces inner:(ary_inner)? ']' {
34
+ def content
35
+ return inner.content if inner.elements
36
+ return []
37
+ end
38
+ }
39
+ end
40
+
41
+ rule ary_inner
42
+ val more:(',' val)* {
43
+ def content
44
+ more.elements.inject([val.content]){|memo,e| memo << e.val.content}
45
+ end
46
+ }
47
+ end
48
+
49
+ rule map
50
+ '{' spaces inner:(map_inner)? '}' {
51
+ def content
52
+ return inner.content if inner.elements
53
+ return {}
54
+ end
55
+ }
56
+ end
57
+
58
+ rule map_inner
59
+ map_entry more:(',' map_entry)* {
60
+ def content
61
+ more.elements.inject(map_entry.content){|memo,e| memo.merge(e.map_entry.content)}
62
+ end
63
+ }
64
+ end
65
+
66
+ rule map_entry
67
+
68
+ key:val ( "=>" / ':' ) value:val {
69
+ def content
70
+ return {key.content => value.content}
71
+ end
72
+ }
73
+ end
74
+
75
+ rule str
76
+ '"' inner:(str_inner) '"' {
77
+ def content
78
+ return inner.content
79
+ end
80
+ }
81
+ end
82
+
83
+ rule str_inner
84
+ ( ( ( "\\\\" )* "\\\"") / !'"' . )* {
85
+ def content
86
+ return text_value.unescape_c_str
87
+ end
88
+ }
89
+ end
90
+
91
+ rule regex
92
+ "/" inner:(regex_inner) "/" regex_options {
93
+ def content
94
+ return Regexp.new(inner.content,regex_options.content)
95
+ end
96
+ }
97
+ end
98
+
99
+ rule regex_inner
100
+ ( ( ( "\\\\" )* "\\/" ) / !"/" . )* {
101
+ def content
102
+ return text_value
103
+ end
104
+ }
105
+ end
106
+
107
+ rule regex_options
108
+ [ixm]* {
109
+ def content
110
+ options = 0
111
+ if text_value.index 'i'
112
+ options += Regexp::IGNORECASE
113
+ end
114
+ if text_value.index 'x'
115
+ options += Regexp::EXTENDED
116
+ end
117
+ if text_value.index 'm'
118
+ options += Regexp::MULTILINE
119
+ end
120
+ return options
121
+ end
122
+ }
123
+ end
124
+
125
+ rule sym
126
+ ':'? spaces inner:(sym_inner) {
127
+ def content
128
+ return inner.content
129
+ end
130
+ }
131
+ end
132
+
133
+ rule sym_inner
134
+ [a-zA-Z_] [a-zA-Z0-9_]* {
135
+ def content
136
+ return text_value.to_sym
137
+ end
138
+ }
139
+ end
140
+
141
+ rule fixnum
142
+ '-'? [0-9]+ {
143
+ def content
144
+ return text_value.to_i
145
+ end
146
+ }
147
+ end
148
+
149
+ rule float
150
+ '-'? [0-9]* '.' [0-9]+ {
151
+ def content
152
+ return text_value.to_f
153
+ end
154
+ }
155
+ end
156
+
157
+ end
158
+
159
+
@@ -0,0 +1,48 @@
1
+ # encoding: UTF-8
2
+
3
+ require 'polyglot'
4
+ require 'treetop'
5
+
6
+ #mg_path = File.join(File.dirname(__FILE__),'/minival_grammar.treetop')
7
+ #Treetop.load(mg_path)
8
+
9
+ Treetop.load('minival_refi/minival_grammar.treetop'
10
+
11
+ #module Minival
12
+
13
+ # extending the MinivalGrammarParser a little
14
+ class MinivalGrammarParser
15
+ def get_errors
16
+ [failure_reason,failure_line,failure_column]
17
+ end
18
+ end
19
+
20
+ class Minival
21
+ #@@parser = MinivalGrammarParser.new
22
+ def initialize(minival_str)
23
+ @parser = MinivalGrammarParser.new
24
+ @parse_result = @parser.parse(minival_str)
25
+ @val = nil
26
+ end
27
+ def valid
28
+ return true if @parse_result
29
+ return false
30
+ end
31
+ def assert_valid
32
+ unless valid
33
+ report_errors
34
+ # TODO
35
+ #dperr 777,'Minival assert_valid failed'
36
+ end
37
+ end
38
+ def report_errors
39
+ pp @parser.get_errors
40
+ end
41
+ def compute_val
42
+ @val = @parse_result.content
43
+ end
44
+ def get_value
45
+ return @val || compute_val
46
+ end
47
+ end
48
+
metadata ADDED
@@ -0,0 +1,96 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: minival_refi
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 0
8
+ - 1
9
+ version: 0.0.1
10
+ platform: ruby
11
+ authors:
12
+ - Robert Fey
13
+ autorequire:
14
+ bindir: bin
15
+ cert_chain: []
16
+
17
+ date: 2011-07-21 00:00:00 +02:00
18
+ default_executable:
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ name: polyglot
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
24
+ none: false
25
+ requirements:
26
+ - - "="
27
+ - !ruby/object:Gem::Version
28
+ segments:
29
+ - 0
30
+ - 3
31
+ - 1
32
+ version: 0.3.1
33
+ type: :runtime
34
+ version_requirements: *id001
35
+ - !ruby/object:Gem::Dependency
36
+ name: treetop
37
+ prerelease: false
38
+ requirement: &id002 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - "="
42
+ - !ruby/object:Gem::Version
43
+ segments:
44
+ - 1
45
+ - 4
46
+ - 9
47
+ version: 1.4.9
48
+ type: :runtime
49
+ version_requirements: *id002
50
+ description: |-
51
+ supports: nil, string, integer, array, hash
52
+ the syntax is similar to to ruby
53
+ email: feyrob@gmail.com
54
+ executables: []
55
+
56
+ extensions: []
57
+
58
+ extra_rdoc_files: []
59
+
60
+ files:
61
+ - lib/minival_refi.rb
62
+ - lib/minival_refi/minival_grammar.treetop
63
+ has_rdoc: true
64
+ homepage: http://rubygems.org/gems/minival_refi
65
+ licenses: []
66
+
67
+ post_install_message:
68
+ rdoc_options: []
69
+
70
+ require_paths:
71
+ - lib
72
+ required_ruby_version: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ">="
76
+ - !ruby/object:Gem::Version
77
+ segments:
78
+ - 0
79
+ version: "0"
80
+ required_rubygems_version: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ">="
84
+ - !ruby/object:Gem::Version
85
+ segments:
86
+ - 0
87
+ version: "0"
88
+ requirements: []
89
+
90
+ rubyforge_project: nowarning
91
+ rubygems_version: 1.3.7
92
+ signing_key:
93
+ specification_version: 3
94
+ summary: an eval-free parser for some data types (using Treetop)
95
+ test_files: []
96
+