rubyang 0.1.2.1 → 0.1.3

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.
@@ -0,0 +1,58 @@
1
+ # coding: utf-8
2
+ # vim: et ts=2 sw=2
3
+
4
+ module Rubyang
5
+ module Model
6
+ class Logger
7
+ @@logger = nil
8
+
9
+ class << self
10
+ def initialize logger
11
+ @@logger = logger
12
+ end
13
+
14
+ def uninitialize
15
+ @@logger = nil
16
+ end
17
+
18
+ def initialized?
19
+ @@logger != nil
20
+ end
21
+ end
22
+
23
+ def initialize name
24
+ @name = name
25
+ end
26
+
27
+ def fatal
28
+ if @@logger
29
+ @@logger.fatal { "#{@name}: #{yield}" }
30
+ end
31
+ end
32
+
33
+ def error
34
+ if @@logger
35
+ @@logger.error { "#{@name}: #{yield}" }
36
+ end
37
+ end
38
+
39
+ def warn
40
+ if @@logger
41
+ @@logger.warn { "#{@name}: #{yield}" }
42
+ end
43
+ end
44
+
45
+ def info
46
+ if @@logger
47
+ @@logger.info { "#{@name}: #{yield}" }
48
+ end
49
+ end
50
+
51
+ def debug
52
+ if @@logger
53
+ @@logger.debug { "#{@name}: #{yield}" }
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
@@ -1,213 +1,215 @@
1
1
  # coding: utf-8
2
+ # vim: et ts=2 sw=2
2
3
 
3
4
  require 'uri'
4
5
  require 'strscan'
5
-
6
- require_relative 'parser/parser.tab'
6
+ require 'rubyang/model/parser/parser.tab'
7
7
 
8
8
  module Rubyang
9
- module Model
10
- class Parser
11
- def self.parse( yang_str )
12
- parser = self.new
13
- parser.parse( yang_str )
14
- end
9
+ module Model
10
+ class Parser
11
+ def self.parse( yang_str )
12
+ parser = self.new
13
+ parser.parse( yang_str )
14
+ end
15
+
16
+ def initialize
17
+ end
15
18
 
16
- def initialize
17
- end
19
+ def parse( yang_str )
20
+ @tokens = Array.new
18
21
 
19
- def parse( yang_str )
20
- @tokens = Array.new
22
+ s = StringScanner.new( yang_str )
21
23
 
22
- s = StringScanner.new( yang_str )
24
+ keywords = {
25
+ ## statement keywords
26
+ "anyxml-keyword" => "anyxml",
27
+ "argument-keyword" => "argument",
28
+ "augment-keyword" => "augment",
29
+ "base-keyword" => "base",
30
+ "belongs-to-keyword" => "belongs-to",
31
+ "bit-keyword" => "bit",
32
+ "case-keyword" => "case",
33
+ "choice-keyword" => "choice",
34
+ "config-keyword" => "config",
35
+ "contact-keyword" => "contact",
36
+ "container-keyword" => "container",
37
+ "default-keyword" => "default",
38
+ "description-keyword" => "description",
39
+ "enum-keyword" => "enum",
40
+ "error-app-tag-keyword" => "error-app-tag",
41
+ "error-message-keyword" => "error-message",
42
+ "extension-keyword" => "extension",
43
+ "deviation-keyword" => "deviation",
44
+ "deviate-keyword" => "deviate",
45
+ "feature-keyword" => "feature",
46
+ "fraction-digits-keyword" => "fraction-digits",
47
+ "grouping-keyword" => "grouping",
48
+ "identity-keyword" => "identity",
49
+ "if-feature-keyword" => "if-feature",
50
+ "import-keyword" => "import",
51
+ "include-keyword" => "include",
52
+ "input-keyword" => "input",
53
+ "key-keyword" => "key",
54
+ "leaf-keyword" => "leaf",
55
+ "leaf-list-keyword" => "leaf-list",
56
+ "length-keyword" => "length",
57
+ "list-keyword" => "list",
58
+ "mandatory-keyword" => "mandatory",
59
+ "max-elements-keyword" => "max-elements",
60
+ "min-elements-keyword" => "min-elements",
61
+ "module-keyword" => "module",
62
+ "must-keyword" => "must",
63
+ "namespace-keyword" => "namespace",
64
+ "notification-keyword" => "notification",
65
+ "ordered-by-keyword" => "ordered-by",
66
+ "organization-keyword" => "organization",
67
+ "output-keyword" => "output",
68
+ "path-keyword" => "path",
69
+ "pattern-keyword" => "pattern",
70
+ "position-keyword" => "position",
71
+ "prefix-keyword" => "prefix",
72
+ "presence-keyword" => "presence",
73
+ "range-keyword" => "range",
74
+ "reference-keyword" => "reference",
75
+ "refine-keyword" => "refine",
76
+ "require-instance-keyword" => "require-instance",
77
+ "revision-keyword" => "revision",
78
+ "revision-date-keyword" => "revision-date",
79
+ "rpc-keyword" => "rpc",
80
+ "status-keyword" => "status",
81
+ "submodule-keyword" => "submodule",
82
+ "type-keyword" => "type",
83
+ "typedef-keyword" => "typedef",
84
+ "unique-keyword" => "unique",
85
+ "units-keyword" => "units",
86
+ "uses-keyword" => "uses",
87
+ "value-keyword" => "value",
88
+ "when-keyword" => "when",
89
+ "yang-version-keyword" => "yang-version",
90
+ "yin-element-keyword" => "yin-element",
23
91
 
24
- keywords = {
25
- ## statement keywords
26
- "anyxml-keyword" => "anyxml",
27
- "argument-keyword" => "argument",
28
- "augment-keyword" => "augment",
29
- "base-keyword" => "base",
30
- "belongs-to-keyword" => "belongs-to",
31
- "bit-keyword" => "bit",
32
- "case-keyword" => "case",
33
- "choice-keyword" => "choice",
34
- "config-keyword" => "config",
35
- "contact-keyword" => "contact",
36
- "container-keyword" => "container",
37
- "default-keyword" => "default",
38
- "description-keyword" => "description",
39
- "enum-keyword" => "enum",
40
- "error-app-tag-keyword" => "error-app-tag",
41
- "error-message-keyword" => "error-message",
42
- "extension-keyword" => "extension",
43
- "deviation-keyword" => "deviation",
44
- "deviate-keyword" => "deviate",
45
- "feature-keyword" => "feature",
46
- "fraction-digits-keyword" => "fraction-digits",
47
- "grouping-keyword" => "grouping",
48
- "identity-keyword" => "identity",
49
- "if-feature-keyword" => "if-feature",
50
- "import-keyword" => "import",
51
- "include-keyword" => "include",
52
- "input-keyword" => "input",
53
- "key-keyword" => "key",
54
- "leaf-keyword" => "leaf",
55
- "leaf-list-keyword" => "leaf-list",
56
- "length-keyword" => "length",
57
- "list-keyword" => "list",
58
- "mandatory-keyword" => "mandatory",
59
- "max-elements-keyword" => "max-elements",
60
- "min-elements-keyword" => "min-elements",
61
- "module-keyword" => "module",
62
- "must-keyword" => "must",
63
- "namespace-keyword" => "namespace",
64
- "notification-keyword" => "notification",
65
- "ordered-by-keyword" => "ordered-by",
66
- "organization-keyword" => "organization",
67
- "output-keyword" => "output",
68
- "path-keyword" => "path",
69
- "pattern-keyword" => "pattern",
70
- "position-keyword" => "position",
71
- "prefix-keyword" => "prefix",
72
- "presence-keyword" => "presence",
73
- "range-keyword" => "range",
74
- "reference-keyword" => "reference",
75
- "refine-keyword" => "refine",
76
- "require-instance-keyword" => "require-instance",
77
- "revision-keyword" => "revision",
78
- "revision-date-keyword" => "revision-date",
79
- "rpc-keyword" => "rpc",
80
- "status-keyword" => "status",
81
- "submodule-keyword" => "submodule",
82
- "type-keyword" => "type",
83
- "typedef-keyword" => "typedef",
84
- "unique-keyword" => "unique",
85
- "units-keyword" => "units",
86
- "uses-keyword" => "uses",
87
- "value-keyword" => "value",
88
- "when-keyword" => "when",
89
- "yang-version-keyword" => "yang-version",
90
- "yin-element-keyword" => "yin-element",
92
+ ## other keywords
93
+ #"add-keyword" => "add",
94
+ #"current-keyword" => "current",
95
+ #"delete-keyword" => "delete",
96
+ #"deprecated-keyword" => "deprecated",
97
+ #"false-keyword" => "false",
98
+ #"max-keyword" => "max",
99
+ #"min-keyword" => "min",
100
+ #"not-supported-keyword" => "not-supported",
101
+ #"obsolete-keyword" => "obsolete",
102
+ #"replace-keyword" => "replace",
103
+ #"system-keyword" => "system",
104
+ #"true-keyword" => "true",
105
+ #"unbounded-keyword" => "unbounded",
106
+ #"user-keyword" => "user",
107
+ }
91
108
 
92
- ## other keywords
93
- #"add-keyword" => "add",
94
- #"current-keyword" => "current",
95
- #"delete-keyword" => "delete",
96
- #"deprecated-keyword" => "deprecated",
97
- #"false-keyword" => "false",
98
- #"max-keyword" => "max",
99
- #"min-keyword" => "min",
100
- #"not-supported-keyword" => "not-supported",
101
- #"obsolete-keyword" => "obsolete",
102
- #"replace-keyword" => "replace",
103
- #"system-keyword" => "system",
104
- #"true-keyword" => "true",
105
- #"unbounded-keyword" => "unbounded",
106
- #"user-keyword" => "user",
107
- }
109
+ scanre_list = [
110
+ ["slcomment", /^\/\/.*$/],
111
+ ["blcomment", /^\/\*.*\*\//m],
112
+ ["dqstr", /^"(?:\\.|[^"])*"/],
113
+ ["sqstr", /^'(?:[^']|\\.)*'/],
114
+ ["nqstr", /^[a-zA-Z0-9:\/\|\.=_-]+/],
115
+ ["+", /^\+/],
116
+ [";", /^\;/],
117
+ #[":", /^\:/],
118
+ #["/", /^\//],
119
+ #["|", /^\|/],
120
+ #["..", /^\.\./],
121
+ #["=", /^\=/],
122
+ ["{", /^\{/],
123
+ ["}", /^\}/],
124
+ ["wsp", /^[ \t]+/],
125
+ ["newline", /^\n/],
126
+ ["return", /^\r/],
127
+ ]
128
+ scanres = scanre_list.to_h
108
129
 
109
- scanre_list = [
110
- ["slcomment", /^\/\/.*$/],
111
- ["blcomment", /^\/\*.*\*\//m],
112
- ["dqstr", /^"(?:\\.|[^"])*"/],
113
- ["sqstr", /^'(?:[^']|\\.)*'/],
114
- ["nqstr", /^[a-zA-Z0-9:\/\|\.=_-]+/],
115
- ["+", /^\+/],
116
- [";", /^\;/],
117
- #[":", /^\:/],
118
- #["/", /^\//],
119
- #["|", /^\|/],
120
- #["..", /^\.\./],
121
- #["=", /^\=/],
122
- ["{", /^\{/],
123
- ["}", /^\}/],
124
- ["wsp", /^[ \t]+/],
125
- ["newline", /^\n/],
126
- ["return", /^\r/],
127
- ]
128
- scanres = scanre_list.to_h
130
+ scanre = Regexp.union( scanre_list.map{ |scanre| scanre[1] } )
129
131
 
130
- scanre = Regexp.union( scanre_list.map{ |scanre| scanre[1] } )
132
+ next_to_kw = false
133
+ until s.eos?
134
+ token = s.scan( scanre )
135
+ #p token
136
+ case token
137
+ when scanres["slcomment"] then
138
+ ;
139
+ when scanres["blcomment"] then
140
+ ;
141
+ when scanres["dqstr"] then
142
+ token_ = token.gsub(/^"/,'').gsub(/"$/,'').gsub(/\\n/,"\n").gsub(/\\t/,"\t").gsub(/\\"/,"\"").gsub(/\\\\/,"\\")
143
+ #if 0 == (token_ =~ URI.regexp)
144
+ #@tokens.push [:URI, token_]
145
+ #else
146
+ @tokens.push [:STRING, token_]
147
+ next_to_kw = false
148
+ #end
149
+ when scanres["sqstr"] then
150
+ token_ = token.gsub(/^'/,'').gsub(/'$/,'')
151
+ #case token_
152
+ #when URI.regexp then @tokens.push [:URI, token_]
153
+ #else @tokens.push [:STRING, token_]
154
+ #end
155
+ @tokens.push [:STRING, token_]
156
+ next_to_kw = false
157
+ when scanres["nqstr"] then
158
+ if (! next_to_kw) and keywords.values.include?(token)
159
+ @tokens.push [keywords.key(token), token]
160
+ next_to_kw = true
161
+ else
162
+ @tokens.push [:STRING, token]
163
+ next_to_kw = false
164
+ end
165
+ when scanres["+"] then
166
+ @tokens.push ["+", token]
167
+ next_to_kw = false
168
+ when scanres[";"] then
169
+ @tokens.push [";", token]
170
+ next_to_kw = false
171
+ #when scanres[":"] then
172
+ # @tokens.push [":", token]
173
+ # next_to_kw = false
174
+ #when scanres["/"] then
175
+ # @tokens.push ["/", token]
176
+ # next_to_kw = false
177
+ #when scanres["|"] then
178
+ # @tokens.push ["|", token]
179
+ # next_to_kw = false
180
+ #when scanres[".."] then
181
+ # @tokens.push ["..", token]
182
+ # next_to_kw = false
183
+ #when scanres["="] then
184
+ # @tokens.push ["=", token]
185
+ # next_to_kw = false
186
+ when scanres["{"] then
187
+ @tokens.push ["{", token]
188
+ next_to_kw = false
189
+ when scanres["}"] then
190
+ @tokens.push ["}", token]
191
+ next_to_kw = false
192
+ when scanres["wsp"] then
193
+ ; #@tokens.push [:WSP, token]
194
+ when scanres["newline"] then
195
+ ; #@tokens.push [:NEWLINE, token]
196
+ when scanres["return"] then
197
+ ; #@tokens.push [:RETURN, token]
198
+ else
199
+ raise "token not match to any scanres: #{token.inspect}"
200
+ end
131
201
 
132
- next_to_kw = false
133
- until s.eos?
134
- token = s.scan( scanre )
135
- #p token
136
- case token
137
- when scanres["slcomment"] then
138
- ;
139
- when scanres["blcomment"] then
140
- ;
141
- when scanres["dqstr"] then
142
- token_ = token.gsub(/^"/,'').gsub(/"$/,'').gsub(/\\n/,"\n").gsub(/\\t/,"\t").gsub(/\\"/,"\"").gsub(/\\\\/,"\\")
143
- #if 0 == (token_ =~ URI.regexp)
144
- #@tokens.push [:URI, token_]
145
- #else
146
- @tokens.push [:STRING, token_]
147
- next_to_kw = false
148
- #end
149
- when scanres["sqstr"] then
150
- token_ = token.gsub(/^'/,'').gsub(/'$/,'')
151
- #case token_
152
- #when URI.regexp then @tokens.push [:URI, token_]
153
- #else @tokens.push [:STRING, token_]
154
- #end
155
- @tokens.push [:STRING, token_]
156
- next_to_kw = false
157
- when scanres["nqstr"] then
158
- if (! next_to_kw) and keywords.values.include?(token)
159
- @tokens.push [keywords.key(token), token]
160
- next_to_kw = true
161
- else
162
- @tokens.push [:STRING, token]
163
- next_to_kw = false
164
- end
165
- when scanres["+"] then
166
- @tokens.push ["+", token]
167
- next_to_kw = false
168
- when scanres[";"] then
169
- @tokens.push [";", token]
170
- next_to_kw = false
171
- when scanres[":"] then
172
- @tokens.push [":", token]
173
- next_to_kw = false
174
- when scanres["/"] then
175
- @tokens.push ["/", token]
176
- next_to_kw = false
177
- when scanres["|"] then
178
- @tokens.push ["|", token]
179
- next_to_kw = false
180
- when scanres[".."] then
181
- @tokens.push ["..", token]
182
- next_to_kw = false
183
- when scanres["="] then
184
- @tokens.push ["=", token]
185
- next_to_kw = false
186
- when scanres["{"] then
187
- @tokens.push ["{", token]
188
- next_to_kw = false
189
- when scanres["}"] then
190
- @tokens.push ["}", token]
191
- next_to_kw = false
192
- when scanres["wsp"] then
193
- ; #@tokens.push [:WSP, token]
194
- when scanres["newline"] then
195
- ; #@tokens.push [:NEWLINE, token]
196
- when scanres["return"] then
197
- ; #@tokens.push [:RETURN, token]
198
- else
199
- raise "token not match to any scanres: #{token.inspect}"
200
- end
201
- end
202
+ #p @tokens.last
203
+ end
202
204
 
203
- result = self.do_parse
204
- end
205
+ result = self.do_parse
206
+ end
205
207
 
206
- def next_token
207
- #p @tokens.first
208
- @tokens.shift
209
- end
210
- end
211
- end
208
+ def next_token
209
+ #p @tokens.first
210
+ @tokens.shift
211
+ end
212
+ end
213
+ end
212
214
  end
213
215