source: ruby/trunk/lib/adl_parser/scanner.rb@ 42

Last change on this file since 42 was 42, checked in by KOBAYASHI, Shinji, 16 years ago

change hiearachy

File size: 13.7 KB
Line 
1require 'logger'
2require 'rubygems'
3gem 'yaparc'
4require 'yaparc'
5
6
7module OpenEHR
8 module ADL
9 module Scanner
10 module Common
11 LOG = Logger.new('log/scanner.log','daily')
12
13 class V_QUALIFIED_TERM_CODE_REF
14 include Yaparc::Parsable
15 def initialize
16 @parser = lambda do |input|
17 Yaparc::Apply.new(Yaparc::Regex.new(/\A\[[a-zA-Z0-9()\._-]+::[a-zA-Z0-9\._-]+\]/)) do |match|
18 LOG.info("V_QUALIFIED_TERM_CODE_REF: #{match}")
19 [:V_QUALIFIED_TERM_CODE_REF, match]
20 end
21 end
22 end
23 end
24
25 class V_LOCAL_TERM_CODE_REF
26 include Yaparc::Parsable
27 def initialize
28 @parser = lambda do |input|
29 Yaparc::Apply.new(Yaparc::Regex.new(/\A\[[a-zA-Z0-9][a-zA-Z0-9._\-]*\]/)) do |match|
30 LOG.info("V_TERM_CODE_REF: #{match}")
31 [:V_LOCAL_TERM_CODE_REF, match]
32 end
33 end
34 end
35 end
36
37 class ERR_V_QUALIFIED_TERM_CODE_REF
38 include Yaparc::Parsable
39 def initialize
40 @parser = lambda do |input|
41 Yaparc::Apply.new(Yaparc::Regex.new(/\A\[[a-zA-Z0-9._\- ]+::[a-zA-Z0-9._\- ]+\]/)) do |match|
42 LOG.info("ERR_V_QUALIFIED_TERM_CODE_REF: #{match}")
43 [:ERR_V_QUALIFIED_TERM_CODE_REF, match]
44 end
45 end
46 end
47 end
48
49 class V_TYPE_IDENTIFIER
50 include Yaparc::Parsable
51 def initialize
52 @parser = lambda do |input|
53 Yaparc::Apply.new(Yaparc::Regex.new(/\A[A-Z][a-zA-Z0-9_]*/)) do |match|
54 LOG.info("V_TYPE_IDENTIFIER: #{match}")
55 [:V_TYPE_IDENTIFIER, match]
56 end
57 end
58 end
59 end
60
61 class V_GENERIC_TYPE_IDENTIFIER
62 include Yaparc::Parsable
63 def initialize
64 @parser = lambda do |input|
65 Yaparc::Apply.new(Yaparc::Regex.new(/\A[A-Z][a-zA-Z0-9_]*<[a-zA-Z0-9,_<>]+>/)) do |match|
66 LOG.info("V_GENERIC_TYPE_IDENTIFIER: #{match}")
67 [:V_GENERIC_TYPE_IDENTIFIER, match]
68 end
69 end
70 end
71 end
72
73
74 class V_LOCAL_CODE
75 include Yaparc::Parsable
76 def initialize
77 @parser = lambda do |input|
78 Yaparc::Apply.new(Yaparc::Regex.new(/\Aa[ct][0-9.]+/)) do |match|
79 LOG.info("V_LOCAL_CODE: #{match}")
80 [:V_LOCAL_CODE, match]
81 end
82 end
83 end
84 end
85
86 class V_STRING
87 include Yaparc::Parsable
88 def initialize
89 @parser = lambda do |input|
90 Yaparc::Apply.new(Yaparc::Regex.new(/\A"([^"]*)"/m)) do |match|
91 LOG.info("V_STRING: #{match}")
92 [:V_STRING, match]
93 end
94 end
95 end
96 end
97
98 class V_REAL
99 include Yaparc::Parsable
100 def initialize
101 @parser = lambda do |input|
102 Yaparc::Apply.new(Yaparc::Regex.new(/\A[0-9]+\.[0-9]+|[0-9]+\.[0-9]+[eE][+-]?[0-9]+/)) do |match|
103 LOG.info("V_REAL: #{match}")
104 [:V_REAL, match]
105 end
106 end
107 end
108 end
109
110 #V_ISO8601_DURATION PnYnMnWnDTnnHnnMnnS
111 class V_ISO8601_DURATION
112 include Yaparc::Parsable
113 def initialize
114 @parser = lambda do |input|
115 Yaparc::Apply.new(
116 Yaparc::Alt.new(Yaparc::Regex.new(/\AP([0-9]+|[yY])?([0-9]+|[mM])?([0-9]+|[wW])?([0-9]+|[dD])?T([0-9]+|[hH])?([0-9]+|[mM])?([0-9]+|[sS])?/),
117 Yaparc::Regex.new(/\AP([0-9]+|[yY])?([0-9]+|[mM])?([0-9]+|[wW])?([0-9]+|[dD])?/))) do |match|
118 LOG.info("V_ISO8601_DURATION: #{match}")
119 [:V_ISO8601_DURATION, match]
120 end
121 end
122 end
123 end
124
125 end # of Common
126
127 module DADL
128 # c.f. http://www.openehr.org/svn/ref_impl_eiffel/TRUNK/components/adl_parser/src/syntax/adl/parser/adl_scanner.l
129 RESERVED = {
130 'true' => :SYM_TRUE, #[Tt][Rr][Uu][Ee] -- -> SYM_TRUE
131 'false' => :SYM_FALSE, # [Ff][Aa][Ll][Ss][Ee] -- -> SYM_FALSE
132 'infinity' => :SYM_INFINITY # [Ii][Nn][Ff][Ii][Nn][Ii][Tt][Yy] -- -> SYM_INFINITY
133 }
134
135 class RootScanner
136 include Yaparc::Parsable
137 def initialize
138 @parser = lambda do |input|
139 Yaparc::Alt.new(Reserved.new,
140 OpenEHR::ADL::Scanner::Common::V_QUALIFIED_TERM_CODE_REF.new,
141 OpenEHR::ADL::Scanner::Common::V_LOCAL_TERM_CODE_REF.new,
142 OpenEHR::ADL::Scanner::Common::ERR_V_QUALIFIED_TERM_CODE_REF.new,
143 OpenEHR::ADL::Scanner::Common::V_TYPE_IDENTIFIER.new,
144 OpenEHR::ADL::Scanner::Common::V_GENERIC_TYPE_IDENTIFIER.new,
145 OpenEHR::ADL::Scanner::Common::V_STRING.new,
146 OpenEHR::ADL::Scanner::Common::V_LOCAL_CODE.new,
147 OpenEHR::ADL::Scanner::Common::V_REAL.new,
148 OpenEHR::ADL::Scanner::Common::V_ISO8601_DURATION.new
149 )
150 end
151 end
152 end
153=begin <DADL::Reserved class>
154=end
155 class Reserved
156 include Yaparc::Parsable
157
158 def initialize
159 @parser = lambda do |input|
160 reserved_parsers = OpenEHR::ADL::Scanner::DADL::RESERVED.map do |keyword|
161 Yaparc::Tokenize.new(
162 Yaparc::Literal.new(keyword[0],false)
163 )
164 end
165 Yaparc::Alt.new(Yaparc::Apply.new(Yaparc::Alt.new(*reserved_parsers)) do |match|
166 OpenEHR::ADL::Scanner::Common::LOG.info("Reserved: #{match}")
167 [OpenEHR::ADL::Scanner::DADL::RESERVED[match], OpenEHR::ADL::Scanner::DADL::RESERVED[match]]
168 end,
169 Yaparc::Apply.new(Yaparc::Regex.new(/\A[a-z][a-zA-Z0-9_]*/)) do |match|
170 OpenEHR::ADL::Scanner::Common::LOG.info("V_ATTRIBUTE_IDENTIFIER: #{match}")
171 [:V_ATTRIBUTE_IDENTIFIER, match]
172 end)
173 end
174 end
175 end
176
177
178
179 end # of DADL
180
181 module CADL
182 # c.f. http://www.openehr.org/svn/ref_impl_eiffel/TRUNK/components/adl_parser/src/syntax/cadl/parser/cadl_scanner.l
183 RESERVED = {
184 'ordered' => :SYM_ORDERED, # [Oo][Rr][Dd][Ee][Rr][Ee][Dd]
185 'unordered' => :SYM_UNORDERED, # [Uu][Nn][Oo][Rr][Dd][Ee][Rr][Ee][Dd]
186 'then' => :SYM_THEN, # [Tt][Hh][Ee][Nn]
187 'else' => :SYM_ELSE, # [Ee][Ll][Ss][Ee]
188 'and' => :SYM_AND, # [Aa][Nn][Dd]
189 'or' => :SYM_OR, # [Oo][Rr]
190 'xor' => :SYM_XOR, # [Xx][Oo][Rr]
191 'not' => :SYM_NOT, # [Nn][Oo][Tt]
192 'implies' => :SYM_IMPLIES, # [Ii][Mm][Pp][Ll][Ii][Ee][Ss]
193 'true' => :SYM_TRUE, #[Tt][Rr][Uu][Ee] -- -> SYM_TRUE
194 'false' => :SYM_FALSE, # [Ff][Aa][Ll][Ss][Ee] -- -> SYM_FALSE
195 'forall' => :SYM_FORALL, # [Ff][Oo][Rr][_][Aa][Ll][Ll]
196 'exists' => :SYM_EXISTS, # [Ee][Xx][Ii][Ss][Tt][Ss]
197 'existence' => :SYM_EXISTENCE, # [Ee][Xx][Iu][Ss][Tt][Ee][Nn][Cc][Ee]
198 'occurrences' => :SYM_OCCURRENCES, # [Oo][Cc][Cc][Uu][Rr][Rr][Ee][Nn][Cc][Ee][Ss]
199 'cardinality' => :SYM_CARDINALITY, # [Cc][Aa][Rr][Dd][Ii][Nn][Aa][Ll][Ii][Tt][Yy]
200 'unique' => :SYM_UNIQUE, # [Uu][Nn][Ii][Qq][Uu][Ee]
201 'matches' => :SYM_MATCHES, # [Mm][Aa][Tt][Cc][Hh][Ee][Ss]
202 'is_in' => :SYM_MATCHES, # [Ii][Ss][_][Ii][Nn]
203 'invariant' => :SYM_INVARIANT, # [Ii][Nn][Vv][Aa][Rr][Ii][Aa][Nn][Tt]
204 'infinity' => :SYM_INFINITY, # [Ii][Nn][Ff][Ii][Nn][Ii][Tt][Yy] -- -> SYM_INFINITY
205 'use_node' => :SYM_USE_NODE, # [Uu][Ss][Ee][_][Nn][Oo][Dd][Ee]
206 'use_archetype' => :SYM_ALLOW_ARCHETYPE, # [Uu][Ss][Ee][_][Aa][Rr][Cc][Hh][Ee][Tt][Yy][Pp][Ee]
207 'allow_archetype' => :SYM_ALLOW_ARCHETYPE, # [Aa][Ll][Ll][Oo][Ww][_][Aa][Rr][Cc][Hh][Ee][Tt][Yy][Pp][Ee]
208 'include' => :SYM_INCLUDE, # [Ii][Nn][Cc][Ll][Uu][Dd][Ee]
209 'exclude' => :SYM_EXCLUDE # [Ee][Xx][Cc][Ll][Uu][Dd][Ee]
210 }
211
212 #V_ISO8601_DATE_TIME_CONSTRAINT_PATTERN, /\A[yY][yY][yY][yY]-[mM?X][mM?X]-[dD?X][dD?X][T\t][hH?X][hH?X]:[mM?X][mM?X]:[sS?X][sS?X]/
213 class V_ISO8601_DATE_TIME_CONSTRAINT_PATTERN
214 include Yaparc::Parsable
215 def initialize
216 @parser = lambda do |input|
217 Yaparc::Apply.new(Yaparc::Regex.new(/\A[yY][yY][yY][yY]-[mM?X][mM?X]-[dD?X][dD?X][T\t][hH?X][hH?X]:[mM?X][mM?X]:[sS?X][sS?X]/)) do |match|
218 OpenEHR::ADL::Scanner::Common::LOG.info("V_ISO8601_DATE_TIME_CONSTRAINT_PATTERN: #{match}")
219 [:V_ISO8601_DATE_TIME_CONSTRAINT_PATTERN, match]
220 end
221 end
222 end
223 end
224
225 #V_ISO8601_DATE_CONSTRAINT_PATTERN /\A[yY][yY][yY][yY]-[mM?X][mM?X]-[dD?X][dD?X]/
226 class V_ISO8601_DATE_CONSTRAINT_PATTERN
227 include Yaparc::Parsable
228 def initialize
229 @parser = lambda do |input|
230 Yaparc::Apply.new(Yaparc::Regex.new(/\A[yY][yY][yY][yY]-[mM?X][mM?X]-[dD?X][dD?X]/)) do |match|
231 OpenEHR::ADL::Scanner::Common::LOG.info("V_ISO8601_DATE_CONSTRAINT_PATTERN: #{match}")
232 [:V_ISO8601_DATE_CONSTRAINT_PATTERN, match]
233 end
234 end
235 end
236 end
237
238 #V_ISO8601_TIME_CONSTRAINT_PATTERN /\A[hH][hH]:[mM?X][mM?X]:[sS?X][sS?X]/
239 class V_ISO8601_TIME_CONSTRAINT_PATTERN
240 include Yaparc::Parsable
241 def initialize
242 @parser = lambda do |input|
243 Yaparc::Apply.new(Yaparc::Regex.new(/\A[hH][hH]:[mM?X][mM?X]:[sS?X][sS?X]/)) do |match|
244 OpenEHR::ADL::Scanner::Common::LOG.info("V_ISO8601_TIME_CONSTRAINT_PATTERN: #{match}")
245 [:V_ISO8601_TIME_CONSTRAINT_PATTERN, match]
246 end
247 end
248 end
249 end
250
251 #V_ISO8601_DURATION_CONSTRAINT_PATTERN
252 class V_ISO8601_DURATION_CONSTRAINT_PATTERN
253 include Yaparc::Parsable
254 def initialize
255 @parser = lambda do |input|
256 Yaparc::Apply.new(Yaparc::Alt.new(Yaparc::Regex.new(/\AP[yY]?[mM]?[wW]?[dD]?T[hH]?[mM]?[sS]?/),
257 Yaparc::Regex.new(/\AP[yY]?[mM]?[wW]?[dD]?/))) do |match|
258 OpenEHR::ADL::Scanner::Common::LOG.info("V_ISO8601_DURATION_CONSTRAINT_PATTERN: #{match}")
259 [:V_ISO8601_DURATION_CONSTRAINT_PATTERN, match]
260 end
261 end
262 end
263 end
264
265 #V_C_DOMAIN_TYPE /\A[A-Z][a-zA-Z0-9_]*[ \n]*\</
266 class V_C_DOMAIN_TYPE
267 include Yaparc::Parsable
268 def initialize
269 @parser = lambda do |input|
270 Yaparc::Apply.new(Yaparc::Regex.new(/\A[A-Z][a-zA-Z0-9_]*[ \n]*\</)) do |match|
271 OpenEHR::ADL::Scanner::Common::LOG.info("V_C_DOMAIN_TYPE: #{match}")
272 [:START_V_C_DOMAIN_TYPE_BLOCK, match]
273 end
274 end
275 end
276 end
277
278 class RootScanner
279 include Yaparc::Parsable
280 def initialize
281 @parser = lambda do |input|
282 Yaparc::Alt.new(V_ISO8601_DATE_TIME_CONSTRAINT_PATTERN.new,
283 V_ISO8601_DATE_CONSTRAINT_PATTERN.new,
284 V_ISO8601_TIME_CONSTRAINT_PATTERN.new,
285 OpenEHR::ADL::Scanner::Common::V_ISO8601_DURATION.new,
286 V_C_DOMAIN_TYPE.new,
287 V_ISO8601_DURATION_CONSTRAINT_PATTERN.new,
288 Reserved.new,
289 OpenEHR::ADL::Scanner::Common::V_QUALIFIED_TERM_CODE_REF.new,
290 OpenEHR::ADL::Scanner::Common::V_LOCAL_TERM_CODE_REF.new,
291 OpenEHR::ADL::Scanner::Common::ERR_V_QUALIFIED_TERM_CODE_REF.new,
292 OpenEHR::ADL::Scanner::Common::V_TYPE_IDENTIFIER.new,
293 OpenEHR::ADL::Scanner::Common::V_GENERIC_TYPE_IDENTIFIER.new,
294 OpenEHR::ADL::Scanner::Common::V_STRING.new,
295 OpenEHR::ADL::Scanner::Common::V_LOCAL_CODE.new,
296 OpenEHR::ADL::Scanner::Common::V_REAL.new,
297 OpenEHR::ADL::Scanner::Common::V_ISO8601_DURATION.new
298 )
299 end
300 end
301 end
302
303=begin <CADL::Reserved class>
304=end
305 class Reserved
306 include Yaparc::Parsable
307
308 def initialize
309 @parser = lambda do |input|
310 orderd_reserved = RESERVED.keys.sort{|x,y| y.length <=> x.length }
311 reserved_parsers = orderd_reserved.map do |keyword|
312 Yaparc::Literal.new(keyword,false)
313 end
314 Yaparc::Alt.new(Yaparc::Apply.new(Yaparc::Alt.new(*reserved_parsers)) do |match|
315 OpenEHR::ADL::Scanner::Common::LOG.info("Reserved: #{match}")
316 [OpenEHR::ADL::Scanner::CADL::RESERVED[match], OpenEHR::ADL::Scanner::CADL::RESERVED[match]]
317 end,
318 Yaparc::Apply.new(Yaparc::Regex.new(/\A[a-z][a-zA-Z0-9_]*/)) do |match|
319 OpenEHR::ADL::Scanner::Common::LOG.info("V_ATTRIBUTE_IDENTIFIER: #{match}")
320 [:V_ATTRIBUTE_IDENTIFIER, match]
321 end)
322 end
323 end
324 end
325
326 end
327 end
328 end
329end
Note: See TracBrowser for help on using the repository browser.