rubyang 0.1.2.1 → 0.1.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -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