1 | require 'logger'
|
---|
2 | require 'rubygems'
|
---|
3 | require 'yaparc'
|
---|
4 |
|
---|
5 |
|
---|
6 |
|
---|
7 | module 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 |
|
---|
154 | class Reserved
|
---|
155 | include Yaparc::Parsable
|
---|
156 |
|
---|
157 | def initialize
|
---|
158 | @parser = lambda do |input|
|
---|
159 | reserved_parsers = OpenEHR::ADL::Scanner::DADL::RESERVED.map do |keyword|
|
---|
160 | Yaparc::Tokenize.new(
|
---|
161 | Yaparc::Literal.new(keyword[0])
|
---|
162 | )
|
---|
163 | end
|
---|
164 | Yaparc::Alt.new(Yaparc::Apply.new(Yaparc::Alt.new(*reserved_parsers)) do |match|
|
---|
165 | OpenEHR::ADL::Scanner::Common::LOG.info("Reserved: #{match}")
|
---|
166 | [OpenEHR::ADL::Scanner::DADL::RESERVED[match], OpenEHR::ADL::Scanner::DADL::RESERVED[match]]
|
---|
167 | end,
|
---|
168 | Yaparc::Apply.new(Yaparc::Regex.new(/\A[a-z][a-zA-Z0-9_]*/)) do |match|
|
---|
169 | OpenEHR::ADL::Scanner::Common::LOG.info("V_ATTRIBUTE_IDENTIFIER: #{match}")
|
---|
170 | [:V_ATTRIBUTE_IDENTIFIER, match]
|
---|
171 | end)
|
---|
172 | end
|
---|
173 | end
|
---|
174 | end
|
---|
175 |
|
---|
176 |
|
---|
177 |
|
---|
178 | end # of DADL
|
---|
179 |
|
---|
180 | module CADL
|
---|
181 | # c.f. http://www.openehr.org/svn/ref_impl_eiffel/TRUNK/components/adl_parser/src/syntax/cadl/parser/cadl_scanner.l
|
---|
182 | RESERVED = {
|
---|
183 | 'ordered' => :SYM_ORDERED, # [Oo][Rr][Dd][Ee][Rr][Ee][Dd]
|
---|
184 | 'unordered' => :SYM_UNORDERED, # [Uu][Nn][Oo][Rr][Dd][Ee][Rr][Ee][Dd]
|
---|
185 | 'then' => :SYM_THEN, # [Tt][Hh][Ee][Nn]
|
---|
186 | 'else' => :SYM_ELSE, # [Ee][Ll][Ss][Ee]
|
---|
187 | 'and' => :SYM_AND, # [Aa][Nn][Dd]
|
---|
188 | 'or' => :SYM_OR, # [Oo][Rr]
|
---|
189 | 'xor' => :SYM_XOR, # [Xx][Oo][Rr]
|
---|
190 | 'not' => :SYM_NOT, # [Nn][Oo][Tt]
|
---|
191 | 'implies' => :SYM_IMPLIES, # [Ii][Mm][Pp][Ll][Ii][Ee][Ss]
|
---|
192 | 'true' => :SYM_TRUE, #[Tt][Rr][Uu][Ee] -- -> SYM_TRUE
|
---|
193 | 'false' => :SYM_FALSE, # [Ff][Aa][Ll][Ss][Ee] -- -> SYM_FALSE
|
---|
194 | 'forall' => :SYM_FORALL, # [Ff][Oo][Rr][_][Aa][Ll][Ll]
|
---|
195 | 'exists' => :SYM_EXISTS, # [Ee][Xx][Ii][Ss][Tt][Ss]
|
---|
196 | 'existence' => :SYM_EXISTENCE, # [Ee][Xx][Iu][Ss][Tt][Ee][Nn][Cc][Ee]
|
---|
197 | 'occurrences' => :SYM_OCCURRENCES, # [Oo][Cc][Cc][Uu][Rr][Rr][Ee][Nn][Cc][Ee][Ss]
|
---|
198 | 'cardinality' => :SYM_CARDINALITY, # [Cc][Aa][Rr][Dd][Ii][Nn][Aa][Ll][Ii][Tt][Yy]
|
---|
199 | 'unique' => :SYM_UNIQUE, # [Uu][Nn][Ii][Qq][Uu][Ee]
|
---|
200 | 'matches' => :SYM_MATCHES, # [Mm][Aa][Tt][Cc][Hh][Ee][Ss]
|
---|
201 | 'is_in' => :SYM_MATCHES, # [Ii][Ss][_][Ii][Nn]
|
---|
202 | 'invariant' => :SYM_INVARIANT, # [Ii][Nn][Vv][Aa][Rr][Ii][Aa][Nn][Tt]
|
---|
203 | 'infinity' => :SYM_INFINITY, # [Ii][Nn][Ff][Ii][Nn][Ii][Tt][Yy] -- -> SYM_INFINITY
|
---|
204 | 'use_node' => :SYM_USE_NODE, # [Uu][Ss][Ee][_][Nn][Oo][Dd][Ee]
|
---|
205 | 'use_archetype' => :SYM_ALLOW_ARCHETYPE, # [Uu][Ss][Ee][_][Aa][Rr][Cc][Hh][Ee][Tt][Yy][Pp][Ee]
|
---|
206 | 'allow_archetype' => :SYM_ALLOW_ARCHETYPE, # [Aa][Ll][Ll][Oo][Ww][_][Aa][Rr][Cc][Hh][Ee][Tt][Yy][Pp][Ee]
|
---|
207 | 'include' => :SYM_INCLUDE, # [Ii][Nn][Cc][Ll][Uu][Dd][Ee]
|
---|
208 | 'exclude' => :SYM_EXCLUDE # [Ee][Xx][Cc][Ll][Uu][Dd][Ee]
|
---|
209 | }
|
---|
210 |
|
---|
211 | #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]/
|
---|
212 | class V_ISO8601_DATE_TIME_CONSTRAINT_PATTERN
|
---|
213 | include Yaparc::Parsable
|
---|
214 | def initialize
|
---|
215 | @parser = lambda do |input|
|
---|
216 | 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|
|
---|
217 | OpenEHR::ADL::Scanner::Common::LOG.info("V_ISO8601_DATE_TIME_CONSTRAINT_PATTERN: #{match}")
|
---|
218 | [:V_ISO8601_DATE_TIME_CONSTRAINT_PATTERN, match]
|
---|
219 | end
|
---|
220 | end
|
---|
221 | end
|
---|
222 | end
|
---|
223 |
|
---|
224 | #V_ISO8601_DATE_CONSTRAINT_PATTERN /\A[yY][yY][yY][yY]-[mM?X][mM?X]-[dD?X][dD?X]/
|
---|
225 | class V_ISO8601_DATE_CONSTRAINT_PATTERN
|
---|
226 | include Yaparc::Parsable
|
---|
227 | def initialize
|
---|
228 | @parser = lambda do |input|
|
---|
229 | Yaparc::Apply.new(Yaparc::Regex.new(/\A[yY][yY][yY][yY]-[mM?X][mM?X]-[dD?X][dD?X]/)) do |match|
|
---|
230 | OpenEHR::ADL::Scanner::Common::LOG.info("V_ISO8601_DATE_CONSTRAINT_PATTERN: #{match}")
|
---|
231 | [:V_ISO8601_DATE_CONSTRAINT_PATTERN, match]
|
---|
232 | end
|
---|
233 | end
|
---|
234 | end
|
---|
235 | end
|
---|
236 |
|
---|
237 | #V_ISO8601_TIME_CONSTRAINT_PATTERN /\A[hH][hH]:[mM?X][mM?X]:[sS?X][sS?X]/
|
---|
238 | class V_ISO8601_TIME_CONSTRAINT_PATTERN
|
---|
239 | include Yaparc::Parsable
|
---|
240 | def initialize
|
---|
241 | @parser = lambda do |input|
|
---|
242 | Yaparc::Apply.new(Yaparc::Regex.new(/\A[hH][hH]:[mM?X][mM?X]:[sS?X][sS?X]/)) do |match|
|
---|
243 | OpenEHR::ADL::Scanner::Common::LOG.info("V_ISO8601_TIME_CONSTRAINT_PATTERN: #{match}")
|
---|
244 | [:V_ISO8601_TIME_CONSTRAINT_PATTERN, match]
|
---|
245 | end
|
---|
246 | end
|
---|
247 | end
|
---|
248 | end
|
---|
249 |
|
---|
250 | #V_ISO8601_DURATION_CONSTRAINT_PATTERN
|
---|
251 | class V_ISO8601_DURATION_CONSTRAINT_PATTERN
|
---|
252 | include Yaparc::Parsable
|
---|
253 | def initialize
|
---|
254 | @parser = lambda do |input|
|
---|
255 | Yaparc::Apply.new(Yaparc::Alt.new(Yaparc::Regex.new(/\AP[yY]?[mM]?[wW]?[dD]?T[hH]?[mM]?[sS]?/),
|
---|
256 | Yaparc::Regex.new(/\AP[yY]?[mM]?[wW]?[dD]?/))) do |match|
|
---|
257 | OpenEHR::ADL::Scanner::Common::LOG.info("V_ISO8601_DURATION_CONSTRAINT_PATTERN: #{match}")
|
---|
258 | [:V_ISO8601_DURATION_CONSTRAINT_PATTERN, match]
|
---|
259 | end
|
---|
260 | end
|
---|
261 | end
|
---|
262 | end
|
---|
263 |
|
---|
264 | #V_C_DOMAIN_TYPE /\A[A-Z][a-zA-Z0-9_]*[ \n]*\</
|
---|
265 | class V_C_DOMAIN_TYPE
|
---|
266 | include Yaparc::Parsable
|
---|
267 | def initialize
|
---|
268 | @parser = lambda do |input|
|
---|
269 | Yaparc::Apply.new(Yaparc::Regex.new(/\A[A-Z][a-zA-Z0-9_]*[ \n]*\</)) do |match|
|
---|
270 | OpenEHR::ADL::Scanner::Common::LOG.info("V_C_DOMAIN_TYPE: #{match}")
|
---|
271 | [:START_V_C_DOMAIN_TYPE_BLOCK, match]
|
---|
272 | end
|
---|
273 | end
|
---|
274 | end
|
---|
275 | end
|
---|
276 |
|
---|
277 | class RootScanner
|
---|
278 | include Yaparc::Parsable
|
---|
279 | def initialize
|
---|
280 | @parser = lambda do |input|
|
---|
281 | Yaparc::Alt.new(V_ISO8601_DATE_TIME_CONSTRAINT_PATTERN.new,
|
---|
282 | V_ISO8601_DATE_CONSTRAINT_PATTERN.new,
|
---|
283 | V_ISO8601_TIME_CONSTRAINT_PATTERN.new,
|
---|
284 | OpenEHR::ADL::Scanner::Common::V_ISO8601_DURATION.new,
|
---|
285 | V_C_DOMAIN_TYPE.new,
|
---|
286 | V_ISO8601_DURATION_CONSTRAINT_PATTERN.new,
|
---|
287 | Reserved.new,
|
---|
288 | OpenEHR::ADL::Scanner::Common::V_QUALIFIED_TERM_CODE_REF.new,
|
---|
289 | OpenEHR::ADL::Scanner::Common::V_LOCAL_TERM_CODE_REF.new,
|
---|
290 | OpenEHR::ADL::Scanner::Common::ERR_V_QUALIFIED_TERM_CODE_REF.new,
|
---|
291 | OpenEHR::ADL::Scanner::Common::V_TYPE_IDENTIFIER.new,
|
---|
292 | OpenEHR::ADL::Scanner::Common::V_GENERIC_TYPE_IDENTIFIER.new,
|
---|
293 | OpenEHR::ADL::Scanner::Common::V_STRING.new,
|
---|
294 | OpenEHR::ADL::Scanner::Common::V_LOCAL_CODE.new,
|
---|
295 | OpenEHR::ADL::Scanner::Common::V_REAL.new,
|
---|
296 | OpenEHR::ADL::Scanner::Common::V_ISO8601_DURATION.new
|
---|
297 | )
|
---|
298 | end
|
---|
299 | end
|
---|
300 | end
|
---|
301 |
|
---|
302 | class Reserved
|
---|
303 | include Yaparc::Parsable
|
---|
304 |
|
---|
305 | def initialize
|
---|
306 | @parser = lambda do |input|
|
---|
307 | orderd_reserved = RESERVED.keys.sort{|x,y| y.length <=> x.length }
|
---|
308 | reserved_parsers = orderd_reserved.map do |keyword|
|
---|
309 | Yaparc::Literal.new(keyword)
|
---|
310 | end
|
---|
311 | Yaparc::Alt.new(Yaparc::Apply.new(Yaparc::Alt.new(*reserved_parsers)) do |match|
|
---|
312 | OpenEHR::ADL::Scanner::Common::LOG.info("Reserved: #{match}")
|
---|
313 | [OpenEHR::ADL::Scanner::CADL::RESERVED[match], OpenEHR::ADL::Scanner::CADL::RESERVED[match]]
|
---|
314 | end,
|
---|
315 | Yaparc::Apply.new(Yaparc::Regex.new(/\A[a-z][a-zA-Z0-9_]*/)) do |match|
|
---|
316 | OpenEHR::ADL::Scanner::Common::LOG.info("V_ATTRIBUTE_IDENTIFIER: #{match}")
|
---|
317 | [:V_ATTRIBUTE_IDENTIFIER, match]
|
---|
318 | end)
|
---|
319 | end
|
---|
320 | end
|
---|
321 | end
|
---|
322 |
|
---|
323 | end
|
---|
324 | end
|
---|
325 | end
|
---|
326 | end
|
---|