source: ruby/trunk/adl_parser/lib/dparser.y@ 4

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

restructuring repository tree

File size: 14.6 KB
Line 
1
2
3class OpenEHR::DADLParser
4
5#options omit_action_call
6
7prechigh
8
9 nonassoc UMINUS UPLUS
10 left '*' '/'
11 left '+' '-'
12
13# left DOUBLE_BAR
14
15 nonassoc SYM_EQ
16 nonassoc SYM_NE
17 nonassoc SYM_LT
18 nonassoc SYM_START_DBLOCK
19 nonassoc SYM_GT
20 nonassoc SYM_END_DBLOCK
21 nonassoc SYM_LE
22 nonassoc SYM_GE
23
24preclow
25
26
27rule
28### http://svn.openehr.org/ref_impl_eiffel/TRUNK/libraries/common_libs/src/structures/syntax/dadl/parser/dadl2_validator.html
29
30dadl: input EOF
31input: attr_vals
32 | complex_object_block
33# | error
34attr_vals: attr_val
35 | attr_vals attr_val
36 | attr_vals ';' attr_val
37attr_val: attr_id SYM_EQ object_block
38attr_id: V_ATTRIBUTE_IDENTIFIER
39# | V_ATTRIBUTE_IDENTIFIER error
40object_block: complex_object_block
41 | primitive_object_block
42complex_object_block: single_attr_object_block
43 | multiple_attr_object_block
44multiple_attr_object_block: untyped_multiple_attr_object_block
45 | type_identifier untyped_multiple_attr_object_block
46untyped_multiple_attr_object_block: multiple_attr_object_block_head keyed_objects SYM_END_DBLOCK
47multiple_attr_object_block_head: SYM_START_DBLOCK
48keyed_objects: keyed_object
49 | keyed_objects keyed_object
50keyed_object: object_key SYM_EQ object_block
51object_key: Left_bracket_code simple_value Right_bracket_code
52
53single_attr_object_block: untyped_single_attr_object_block
54 | type_identifier untyped_single_attr_object_block
55untyped_single_attr_object_block: single_attr_object_complex_head SYM_END_DBLOCK
56 | single_attr_object_complex_head attr_vals SYM_END_DBLOCK
57single_attr_object_complex_head: SYM_START_DBLOCK
58primitive_object_block: untyped_primitive_object_block
59 | type_identifier untyped_primitive_object_block
60untyped_primitive_object_block: SYM_START_DBLOCK primitive_object_value SYM_END_DBLOCK
61primitive_object_value: simple_value
62 | simple_list_value
63 | simple_interval_value
64 | term_code
65 | term_code_list_value
66simple_value: string_value
67 | integer_value
68 | real_value
69 | boolean_value
70 | character_value
71 | date_value
72 | time_value
73 | date_time_value
74 | duration_value
75 | uri_value
76simple_list_value: string_list_value
77 | integer_list_value
78 | real_list_value
79 | boolean_list_value
80 | character_list_value
81 | date_list_value
82 | time_list_value
83 | date_time_list_value
84 | duration_list_value
85
86simple_interval_value: integer_interval_value
87 | real_interval_value
88 | date_interval_value
89 | time_interval_value
90 | date_time_interval_value
91 | duration_interval_value
92
93type_identifier: V_TYPE_IDENTIFIER
94 | V_GENERIC_TYPE_IDENTIFIER
95
96string_value: V_STRING
97
98string_list_value: V_STRING Comma_code V_STRING
99 | string_list_value Comma_code V_STRING
100 | V_STRING Comma_code SYM_LIST_CONTINUE
101integer_value: V_INTEGER
102 | '+' V_INTEGER
103 | '-' V_INTEGER
104integer_list_value: integer_value Comma_code integer_value
105 | integer_list_value Comma_code integer_value
106 | integer_value Comma_code SYM_LIST_CONTINUE
107
108integer_interval_value: SYM_INTERVAL_DELIM integer_value SYM_ELLIPSIS integer_value SYM_INTERVAL_DELIM
109 | SYM_INTERVAL_DELIM SYM_GT integer_value SYM_ELLIPSIS integer_value SYM_INTERVAL_DELIM
110 | SYM_INTERVAL_DELIM integer_value SYM_ELLIPSIS SYM_LT integer_value SYM_INTERVAL_DELIM
111 | SYM_INTERVAL_DELIM SYM_GT integer_value SYM_ELLIPSIS SYM_LT integer_value SYM_INTERVAL_DELIM
112 | SYM_INTERVAL_DELIM SYM_LT integer_value SYM_INTERVAL_DELIM
113 | SYM_INTERVAL_DELIM SYM_LE integer_value SYM_INTERVAL_DELIM
114 | SYM_INTERVAL_DELIM SYM_GT integer_value SYM_INTERVAL_DELIM
115 | SYM_INTERVAL_DELIM SYM_GE integer_value SYM_INTERVAL_DELIM
116 | SYM_INTERVAL_DELIM integer_value SYM_INTERVAL_DELIM
117
118real_value: V_REAL
119 | '+' V_REAL
120 | '-' V_REAL
121
122real_list_value: real_value Comma_code real_value
123 | real_list_value Comma_code real_value
124 | real_value Comma_code SYM_LIST_CONTINUE
125
126real_interval_value: SYM_INTERVAL_DELIM real_value SYM_ELLIPSIS real_value SYM_INTERVAL_DELIM
127 | SYM_INTERVAL_DELIM SYM_GT real_value SYM_ELLIPSIS real_value SYM_INTERVAL_DELIM
128 | SYM_INTERVAL_DELIM real_value SYM_ELLIPSIS SYM_LT real_value SYM_INTERVAL_DELIM
129 | SYM_INTERVAL_DELIM SYM_GT real_value SYM_ELLIPSIS SYM_LT real_value SYM_INTERVAL_DELIM
130 | SYM_INTERVAL_DELIM SYM_LT real_value SYM_INTERVAL_DELIM
131 | SYM_INTERVAL_DELIM SYM_LE real_value SYM_INTERVAL_DELIM
132 | SYM_INTERVAL_DELIM SYM_GT real_value SYM_INTERVAL_DELIM
133 | SYM_INTERVAL_DELIM SYM_GE real_value SYM_INTERVAL_DELIM
134 | SYM_INTERVAL_DELIM real_value SYM_INTERVAL_DELIM
135
136
137boolean_value: SYM_TRUE
138 | SYM_FALSE
139
140boolean_list_value: boolean_value Comma_code boolean_value
141 | boolean_list_value Comma_code boolean_value
142 | boolean_value Comma_code SYM_LIST_CONTINUE
143
144character_value: V_CHARACTER
145
146character_list_value: character_value Comma_code character_value
147 | character_list_value Comma_code character_value
148 | character_value Comma_code SYM_LIST_CONTINUE
149
150date_value: V_ISO8601_EXTENDED_DATE
151
152date_list_value: date_value Comma_code date_value
153 | date_list_value Comma_code date_value
154 | date_value Comma_code SYM_LIST_CONTINUE
155
156date_interval_value: SYM_INTERVAL_DELIM date_value SYM_ELLIPSIS date_value SYM_INTERVAL_DELIM
157 | SYM_INTERVAL_DELIM SYM_GT date_value SYM_ELLIPSIS date_value SYM_INTERVAL_DELIM
158 | SYM_INTERVAL_DELIM date_value SYM_ELLIPSIS SYM_LT date_value SYM_INTERVAL_DELIM
159 | SYM_INTERVAL_DELIM SYM_GT date_value SYM_ELLIPSIS SYM_LT date_value SYM_INTERVAL_DELIM
160 | SYM_INTERVAL_DELIM SYM_LT date_value SYM_INTERVAL_DELIM
161 | SYM_INTERVAL_DELIM SYM_LE date_value SYM_INTERVAL_DELIM
162 | SYM_INTERVAL_DELIM SYM_GT date_value SYM_INTERVAL_DELIM
163 | SYM_INTERVAL_DELIM SYM_GE date_value SYM_INTERVAL_DELIM
164 | SYM_INTERVAL_DELIM date_value SYM_INTERVAL_DELIM
165
166time_value: V_ISO8601_EXTENDED_TIME
167time_list_value: time_value Comma_code time_value
168 | time_list_value Comma_code time_value
169 | time_value Comma_code SYM_LIST_CONTINUE
170
171time_interval_value: SYM_INTERVAL_DELIM time_value SYM_ELLIPSIS time_value SYM_INTERVAL_DELIM
172 | SYM_INTERVAL_DELIM SYM_GT time_value SYM_ELLIPSIS time_value SYM_INTERVAL_DELIM
173 | SYM_INTERVAL_DELIM time_value SYM_ELLIPSIS SYM_LT time_value SYM_INTERVAL_DELIM
174 | SYM_INTERVAL_DELIM SYM_GT time_value SYM_ELLIPSIS SYM_LT time_value SYM_INTERVAL_DELIM
175 | SYM_INTERVAL_DELIM SYM_LT time_value SYM_INTERVAL_DELIM
176 | SYM_INTERVAL_DELIM SYM_LE time_value SYM_INTERVAL_DELIM
177 | SYM_INTERVAL_DELIM SYM_GT time_value SYM_INTERVAL_DELIM
178 | SYM_INTERVAL_DELIM SYM_GE time_value SYM_INTERVAL_DELIM
179 | SYM_INTERVAL_DELIM time_value SYM_INTERVAL_DELIM
180
181date_time_value: V_ISO8601_EXTENDED_DATE_TIME
182
183date_time_list_value: date_time_value Comma_code date_time_value
184 | date_time_list_value Comma_code date_time_value
185 | date_time_value Comma_code SYM_LIST_CONTINUE
186
187date_time_interval_value: SYM_INTERVAL_DELIM date_time_value SYM_ELLIPSIS date_time_value SYM_INTERVAL_DELIM
188 | SYM_INTERVAL_DELIM SYM_GT date_time_value SYM_ELLIPSIS date_time_value SYM_INTERVAL_DELIM
189 | SYM_INTERVAL_DELIM date_time_value SYM_ELLIPSIS SYM_LT date_time_value SYM_INTERVAL_DELIM
190 | SYM_INTERVAL_DELIM SYM_GT date_time_value SYM_ELLIPSIS SYM_LT date_time_value SYM_INTERVAL_DELIM
191 | SYM_INTERVAL_DELIM SYM_LT date_time_value SYM_INTERVAL_DELIM
192 | SYM_INTERVAL_DELIM SYM_LE date_time_value SYM_INTERVAL_DELIM
193 | SYM_INTERVAL_DELIM SYM_GT date_time_value SYM_INTERVAL_DELIM
194 | SYM_INTERVAL_DELIM SYM_GE date_time_value SYM_INTERVAL_DELIM
195 | SYM_INTERVAL_DELIM date_time_value SYM_INTERVAL_DELIM
196
197duration_value: V_ISO8601_DURATION
198
199duration_list_value: duration_value Comma_code duration_value
200 | duration_list_value Comma_code duration_value
201 | duration_value Comma_code SYM_LIST_CONTINUE
202
203duration_interval_value: SYM_INTERVAL_DELIM duration_value SYM_ELLIPSIS duration_value SYM_INTERVAL_DELIM
204 | SYM_INTERVAL_DELIM SYM_GT duration_value SYM_ELLIPSIS duration_value SYM_INTERVAL_DELIM
205 | SYM_INTERVAL_DELIM duration_value SYM_ELLIPSIS SYM_LT duration_value SYM_INTERVAL_DELIM
206 | SYM_INTERVAL_DELIM SYM_GT duration_value SYM_ELLIPSIS SYM_LT duration_value SYM_INTERVAL_DELIM
207 | SYM_INTERVAL_DELIM SYM_LT duration_value SYM_INTERVAL_DELIM
208 | SYM_INTERVAL_DELIM SYM_LE duration_value SYM_INTERVAL_DELIM
209 | SYM_INTERVAL_DELIM SYM_GT duration_value SYM_INTERVAL_DELIM
210 | SYM_INTERVAL_DELIM SYM_GE duration_value SYM_INTERVAL_DELIM
211 | SYM_INTERVAL_DELIM duration_value SYM_INTERVAL_DELIM
212
213term_code: V_QUALIFIED_TERM_CODE_REF
214
215term_code_list_value: term_code Comma_code term_code
216 | term_code_list_value Comma_code term_code
217 | term_code Comma_code SYM_LIST_CONTINUE
218
219uri_value: V_URI
220
221---- header
222
223$:.unshift File.join(File.dirname(__FILE__))
224$DEBUG = false
225
226
227---- inner
228###----------/* keywords */ ---------------------------------------------
229@@reserved = {
230 'true' => :SYM_TRUE, #[Tt][Rr][Uu][Ee] -- -> SYM_TRUE
231 'false' => :SYM_FALSE, # [Ff][Aa][Ll][Ss][Ee] -- -> SYM_FALSE
232 'infinity' => :SYM_INFINITY # [Ii][Nn][Ff][Ii][Nn][Ii][Tt][Yy] -- -> SYM_INFINITY
233}
234
235###----------/* Scanner */ -----------------------------------------------
236
237def scan
238 until @data.nil? do
239 case @data
240 when /\A\n/ # carriage return
241 @lineno += 1
242 ;
243 when /\A[ \t\r\f]+/ #just drop it
244 ;
245 when /\A--.*\n/ # single line comment
246 @lineno += 1
247 ;
248 ###----------/* symbols */ -------------------------------------------------
249 when /\A\=/ # =
250 yield :SYM_EQ, :SYM_EQ
251 when /\A\>\=/ # >=
252 yield :SYM_GE, :SYM_GE
253 when /\A\<\=/ # <=
254 yield :SYM_LE, :SYM_LE
255 when /\A\</ # <
256 if @in_interval
257 @start_block_received = false
258 yield :SYM_LT, :SYM_LT
259 else
260 @start_block_received = true
261 yield :SYM_START_DBLOCK, :SYM_START_DBLOCK
262 end
263 when /\A\>/ # >
264 if @in_interval
265 yield :SYM_GT, :SYM_GT
266 else
267 yield :SYM_END_DBLOCK, :SYM_END_DBLOCK
268 end
269 when /\A\-/ # -
270 yield :Minus_code, :Minus_code
271 when /\A\+/ # +
272 yield :Plus_code, :Plus_code
273 when /\A\*/ # *
274 yield :Star_code, :Star_code
275 when /\A\// # /
276 yield :Slash_code, :Slash_code
277 when /\A\^/ # ^
278 yield :Caret_code, :Caret_code
279 when /\A\./ # .
280 yield :Dot_code, :Dot_code
281 when /\A\;/ # ;
282 yield :Semicolon_code, :Semicolon_code
283 when /\A\,/ # ,
284 yield :Comma_code, :Comma_code
285 when /\A\:/ # :
286 yield :Colon_code, :Colon_code
287 when /\A\!/ # !
288 yield :Exclamation_code, :Exclamation_code
289 when /\A\(/ # (
290 yield :Left_parenthesis_code, :Left_parenthesis_code
291 when /\A\)/ # )
292 yield :Right_parenthesis_code, :Right_parenthesis_code
293 when /\A\$/ # $
294 yield :Dollar_code, :Dollar_code
295 when /\A\?\?/ # ??
296 yield :SYM_DT_UNKNOWN, :SYM_DT_UNKNOWN
297 when /\A\?/ # ?
298 yield :Question_mark_code, :Question_mark_code
299 when /\A\|/ # |
300 if @in_interval
301 @in_interval = false
302 elsif @start_block_received
303 @in_interval = true
304 @start_block_received = false
305 end
306 yield :SYM_INTERVAL_DELIM, :SYM_INTERVAL_DELIM
307 when /\A\[/ # [
308 yield :Left_bracket_code, :Left_bracket_code
309 when /\A\]/ # ]
310 yield :Right_bracket_code, :Right_bracket_code
311 when /\A\../ # ..
312 yield :SYM_ELLIPSIS, :SYM_ELLIPSIS
313 when /\A\.../ # ...
314 yield :SYM_LIST_CONTINUE, :SYM_LIST_CONTINUE
315 when /\A[A-Z][a-zA-Z0-9_]*<[a-zA-Z0-9,_<>]+>/ #V_GENERIC_TYPE_IDENTIFIER
316 yield :V_GENERIC_TYPE_IDENTIFIER, $&
317 when /\A[a-z][a-zA-Z0-9_]*/
318 word = $&.downcase
319 if @@reserved[word]
320 yield @@reserved[word], @@reserved[word]
321 else
322 yield :V_ATTRIBUTE_IDENTIFIER, $&
323 end
324 when /\A\[[a-zA-Z0-9._\-]+::[a-zA-Z0-9._\-]+\]/ #V_QUALIFIED_TERM_CODE_REF form [ICD10AM(1998)::F23]
325 yield :V_QUALIFIED_TERM_CODE_REF, $&
326 when /\A\[[a-zA-Z0-9._\- ]+::[a-zA-Z0-9._\- ]+\]/ #ERR_V_QUALIFIED_TERM_CODE_REF
327 yield :ERR_V_QUALIFIED_TERM_CODE_REF, $&
328 when /\A\[[a-zA-Z0-9][a-zA-Z0-9._\-]*\]/ #V_LOCAL_TERM_CODE_REF
329 yield :V_LOCAL_TERM_CODE_REF, $&
330 when /\Aa[ct][0-9.]+/ #V_LOCAL_CODE
331 yield :V_LOCAL_CODE, $&
332 when /\A[0-9]{4}-[0-1][0-9]-[0-3][0-9]T[0-2][0-9]:[0-6][0-9]:[0-6][0-9](,[0-9]+)?(Z|[+-][0-9]{4})?|[0-9]{4}-[0-1][0-9]-[0-3][0-9]T[0-2][0-9]:[0-6][0-9](Z|[+-][0-9]{4})?|[0-9]{4}-[0-1][0-9]-[0-3][0-9]T[0-2][0-9](Z|[+-][0-9]{4})?/ #V_ISO8601_EXTENDED_DATE_TIME YYYY-MM-DDThh:mm:ss[,sss][Z|+/- -n-n-n-n-]-
333 yield :V_ISO8601_EXTENDED_DATE_TIME, $&
334 when /\A[0-2][0-9]:[0-6][0-9]:[0-6][0-9](,[0-9]+)?(Z|[+-][0-9]{4})?|[0-2][0-9]:[0-6][0-9](Z|[+-][0-9]{4})? / #V_ISO8601_EXTENDED_TIME hh:mm:ss[,sss][Z|+/-nnnn]
335 yield :V_ISO8601_EXTENDED_TIME, $&
336 when /\A[0-9]{4}-[0-1][0-9]-[0-3][0-9]|[0-9]{4}-[0-1][0-9]/ #V_ISO8601_EXTENDED_DATE YYYY-MM-DD
337 yield :V_ISO8601_EXTENDED_DATE, $&
338 when /\AP([0-9]+[yY])?([0-9]+[mM])?([0-9]+[wW])?([0-9]+[dD])?T([0-9]+[hH])?([0-9]+[mM])?([0-9]+[sS])?|P([0-9]+[yY])?([0-9]+[mM])?([0-9]+[wW])?([0-9]+[dD])?/ #V_ISO8601_DURATION PnYnMnWnDTnnHnnMnnS
339 yield :V_ISO8601_DURATION, $&
340 when /\A[A-Z][a-zA-Z0-9_]*<[a-zA-Z0-9,_<>]+>/ #V_GENERIC_TYPE_IDENTIFIER
341 yield :V_GENERIC_TYPE_IDENTIFIER, $&
342 when /\A[0-9]+|[0-9]+[eE][+-]?[0-9]+/ #V_INTEGER
343 yield :V_INTEGER, $&
344 when /\A[0-9]+\.[0-9]+|[0-9]+\.[0-9]+[eE][+-]?[0-9]+ / #V_REAL
345 yield :V_REAL, $&
346# when /\A"((?:[^"\\]+|\\.)*)"/ #V_STRING
347 when /\A"([^"]*)"/m #V_STRING
348 yield :V_STRING, $1
349# \"[^\\\n"]*\"
350# \"[^\\\n"]*{ -- beginning of a multi-line string
351# <IN_STR> {
352# \\\\ -- match escaped backslash, i.e. \\ -> \
353# \\\" -- match escaped double quote, i.e. \” -> “
354# {UTF8CHAR}+ -- match UTF8 chars
355# [^\\\n"]+ -- match any other characters
356# \\\n[ \t\r]* -- match LF in line
357# [^\\\n"]*\" -- match final end of string
358# .|\n |
359# <<EOF>> -- unclosed String -> ERR_STRING
360# }
361# ###----------/* V_CHARACTER */ --------------------------------------------
362# \'{UTF8CHAR}\' -- UTF8 char
363# \'.{1,2} |
364# \'\\[0-9]+(\/)? -- invalid character -> ERR_CHARACTER
365 when /\A[a-z]+:\/\/[^<>|\\{}^~"\[\] ]*/ #V_URI
366 yield :V_URI, $&
367 when /\A\S/ #UTF8CHAR
368 yield :UTF8CHAR, $&
369 end
370 @data = $' # variable $' receives the string after the match
371 end
372 yield :EOF, nil
373 yield false, '$'
374end # of scan
375
376
377def parse(data, filename, lineno = 1, debug = false)
378 @yydebug = true
379 @parsestring = data
380 @data = data
381 @lineno = lineno
382 @filename = filename
383 @in_interval = false
384 @start_block_received = false
385 @start_block_received = false
386 yyparse self, :scan
387end
388
389def on_error( t, v, values)
390 raise Racc::ParseError, "#{@filename}:#{@lineno}: Inline syntax error on #{v.inspect}"
391end
392
393# ###----------/* CADL Blocks */ -------------------------------------------
394# \{[^{}]* -- beginning of CADL block
395# <IN_CADL_BLOCK>\{[^{}]* -- got an open brace
396# <IN_CADL_BLOCK>[^{}]*\} -- got a close brace
397
398
399
400
401
402
403### Local Variables:
404### mode:ruby
405### mode:font-lock
406### comment-column:0
407### comment-start: "### "
408### comment-end:""
409### End:
410
411
412
413
Note: See TracBrowser for help on using the repository browser.