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

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

restructuring repository tree

File size: 21.4 KB
Line 
1
2
3class OpenEHR::CADLParser
4
5#options omit_action_call
6
7prechigh
8
9 nonassoc UMINUS UPLUS
10# left '*' '/'
11 left Star_code Slash_code
12 left '+' '-'
13
14 nonassoc SYM_EQ
15 nonassoc SYM_NE
16 nonassoc SYM_LT
17 nonassoc SYM_START_DBLOCK
18 nonassoc SYM_GT
19 nonassoc SYM_END_DBLOCK
20 nonassoc SYM_LE
21 nonassoc SYM_GE
22
23preclow
24
25
26rule
27 ### http://svn.openehr.org/ref_impl_eiffel/TRUNK/components/adl_parser/src/syntax/cadl/parser/cadl_validator.y
28
29cadl: input EOF
30input: c_complex_object
31 | assertions
32# | error
33
34c_complex_object: c_complex_object_head SYM_MATCHES SYM_START_CBLOCK c_complex_object_body SYM_END_CBLOCK
35
36c_complex_object_head: c_complex_object_id c_occurrences
37
38c_complex_object_id: type_identifier
39 | type_identifier V_LOCAL_TERM_CODE_REF
40
41c_complex_object_body: c_any #-- used to indicate that any value of a type is ok
42 | c_attributes
43
44
45#------------------------- node types -----------------------
46
47c_object: c_complex_object
48 | archetype_internal_ref
49 | archetype_slot
50 | constraint_ref
51 | c_code_phrase
52 | c_ordinal
53 | c_primitive_object
54 | V_C_DOMAIN_TYPE
55 | ERR_C_DOMAIN_TYPE
56 | error
57
58# 'archetype_internal_ref' is a node that refers to a previously defined object node in the same archetype.
59archetype_internal_ref: SYM_USE_NODE type_identifier c_occurrences absolute_path
60 | SYM_USE_NODE type_identifier error
61
62# 'archetype_slot' is a node whose statements define a constraint that determines which other archetypes may appear at that point in the current archetype.
63archetype_slot: c_archetype_slot_head SYM_MATCHES SYM_START_CBLOCK c_includes c_excludes SYM_END_CBLOCK
64
65c_archetype_slot_head: c_archetype_slot_id c_occurrences
66
67c_archetype_slot_id: SYM_ALLOW_ARCHETYPE type_identifier
68 | SYM_ALLOW_ARCHETYPE type_identifier V_LOCAL_TERM_CODE_REF
69 | SYM_ALLOW_ARCHETYPE error
70
71# 'c_primitive_object' is an node representing a constraint on a primitive object type.
72c_primitive_object: c_primitive
73
74c_primitive: c_integer
75 | c_real
76 | c_date
77 | c_time
78 | c_date_time
79 | c_duration
80 | c_string
81 | c_boolean
82
83c_any: Star_code
84#c_any: '*'
85
86#---------------- BODY - relationships ----------------
87
88c_attributes: c_attribute
89 | c_attributes c_attribute
90
91# 'c_attribute' is a node representing a constraint on an attribute in an object model.
92c_attribute: c_attr_head SYM_MATCHES SYM_START_CBLOCK c_attr_values SYM_END_CBLOCK
93 | c_attr_head SYM_MATCHES SYM_START_CBLOCK error SYM_END_CBLOCK
94
95
96c_attr_head: V_ATTRIBUTE_IDENTIFIER c_existence
97 | V_ATTRIBUTE_IDENTIFIER c_existence c_cardinality
98
99c_attr_values: c_object
100 | c_attr_values c_object
101 | c_any # -- to allow a property to have any value
102
103c_includes: #-- Empty
104 | SYM_INCLUDE assertions
105
106c_excludes: #-- Empty
107 | SYM_EXCLUDE assertions
108
109
110#---------------------- ASSERTIONS ------------------------
111
112assertions: assertion
113 | assertions assertion
114
115assertion: any_identifier ':' boolean_expression
116 | boolean_expression
117# | any_identifier ':' error
118
119#---------------------- expressions ---------------------
120
121boolean_expression: boolean_leaf
122 | boolean_node
123
124boolean_node: SYM_EXISTS absolute_path
125# | SYM_EXISTS error
126 | relative_path SYM_MATCHES SYM_START_CBLOCK c_primitive SYM_END_CBLOCK
127 | SYM_NOT boolean_leaf
128 | arithmetic_expression '=' arithmetic_expression
129 | arithmetic_expression SYM_NE arithmetic_expression
130 | arithmetic_expression SYM_LT arithmetic_expression
131 | arithmetic_expression SYM_GT arithmetic_expression
132 | arithmetic_expression SYM_LE arithmetic_expression
133 | arithmetic_expression SYM_GE arithmetic_expression
134 | boolean_expression SYM_AND boolean_expression
135 | boolean_expression SYM_OR boolean_expression
136 | boolean_expression SYM_XOR boolean_expression
137 | boolean_expression SYM_IMPLIES boolean_expression
138
139boolean_leaf: Left_parenthesis_code boolean_expression Right_parenthesis_code
140 | SYM_TRUE
141 | SYM_FALSE
142
143arithmetic_expression: arithmetic_leaf
144 | arithmetic_node
145
146arithmetic_node: arithmetic_expression '+' arithmetic_leaf
147 | arithmetic_expression '-' arithmetic_leaf
148 | arithmetic_expression Star_code arithmetic_leaf
149 | arithmetic_expression Slash_code arithmetic_leaf
150 | arithmetic_expression '^' arithmetic_leaf
151
152arithmetic_leaf: Left_parenthesis_code arithmetic_expression Right_parenthesis_code
153 | integer_value
154 | real_value
155 | absolute_path
156
157
158#--------------- THE FOLLOWING SOURCE TAKEN FROM OG_PATH_VALIDATOR.Y - DO NOT MODIFY -------------
159#--------------- except to remove movable_path ----------------------------------------------------
160
161absolute_path: Slash_code
162 | Slash_code relative_path
163 | absolute_path Slash_code relative_path
164
165relative_path: path_segment
166 | relative_path Slash_code path_segment
167
168path_segment: V_ATTRIBUTE_IDENTIFIER V_LOCAL_TERM_CODE_REF
169 | V_ATTRIBUTE_IDENTIFIER
170
171
172#-------------------------------- END SOURCE TAKEN FROM OG_PATH_VALIDATOR.Y ----------------------
173
174
175#---------------- existence, occurrences, cardinality ----------------
176
177c_existence: #-- default to 1..1
178 | SYM_EXISTENCE SYM_MATCHES SYM_START_CBLOCK existence_spec SYM_END_CBLOCK
179
180existence_spec: V_INTEGER #-- can only be 0 or 1
181 | V_INTEGER SYM_ELLIPSIS V_INTEGER #-- can only be 0..0, 0..1, 1..1
182
183c_cardinality: SYM_CARDINALITY SYM_MATCHES SYM_START_CBLOCK cardinality_spec SYM_END_CBLOCK
184
185cardinality_spec: occurrence_spec
186 | occurrence_spec Semicolon_code SYM_ORDERED
187 | occurrence_spec Semicolon_code SYM_UNORDERED
188 | occurrence_spec Semicolon_code SYM_UNIQUE
189 | occurrence_spec Semicolon_code SYM_ORDERED Semicolon_code SYM_UNIQUE
190 | occurrence_spec Semicolon_code SYM_UNORDERED Semicolon_code SYM_UNIQUE
191 | occurrence_spec Semicolon_code SYM_UNIQUE Semicolon_code SYM_ORDERED
192 | occurrence_spec Semicolon_code SYM_UNIQUE Semicolon_code SYM_UNORDERED
193
194cardinality_limit_value: integer_value
195 | Star_code
196# | '*'
197
198c_occurrences: #-- default to 1..1
199 | SYM_OCCURRENCES SYM_MATCHES SYM_START_CBLOCK occurrence_spec SYM_END_CBLOCK
200# | SYM_OCCURRENCES error
201
202occurrence_spec: cardinality_limit_value #-- single integer or '*'
203 | V_INTEGER SYM_ELLIPSIS cardinality_limit_value
204
205#---------------------- leaf constraint types -----------------------
206
207c_integer_spec: integer_value
208 | integer_list_value
209 | integer_interval_value
210
211c_integer: c_integer_spec
212 | c_integer_spec Semicolon_code integer_value
213 | c_integer_spec Semicolon_code error
214
215c_real_spec: real_value
216 | real_list_value
217 | real_interval_value
218
219c_real: c_real_spec
220 | c_real_spec Semicolon_code real_value
221 | c_real_spec Semicolon_code error
222
223c_date_constraint: V_ISO8601_DATE_CONSTRAINT_PATTERN
224 | date_value
225 | date_interval_value
226
227c_date: c_date_constraint
228 | c_date_constraint Semicolon_code date_value
229 | c_date_constraint Semicolon_code error
230
231c_time_constraint: V_ISO8601_TIME_CONSTRAINT_PATTERN
232 | time_value
233 | time_interval_value
234
235c_time: c_time_constraint
236 | c_time_constraint Semicolon_code time_value
237 | c_time_constraint Semicolon_code error
238
239c_date_time_constraint: V_ISO8601_DATE_TIME_CONSTRAINT_PATTERN
240 | date_time_value
241 | date_time_interval_value
242
243c_date_time: c_date_time_constraint
244 | c_date_time_constraint Semicolon_code date_time_value
245 | c_date_time_constraint Semicolon_code error
246
247c_duration_constraint: duration_pattern
248 | duration_pattern Slash_code duration_interval_value
249 | duration_value
250 | duration_interval_value
251
252c_duration: c_duration_constraint
253 | c_duration_constraint Semicolon_code duration_value
254 | c_duration_constraint Semicolon_code error
255
256c_string_spec: V_STRING #-- single value, generates closed list
257 | string_list_value #-- closed list
258 | string_list_value ',' SYM_LIST_CONTINUE #-- open list
259 | V_REGEXP #-- regular expression with "//" or "^^" delimiters
260
261c_string: c_string_spec
262 | c_string_spec Semicolon_code string_value
263# | c_string_spec Semicolon_code error
264
265c_boolean_spec: SYM_TRUE
266 | SYM_FALSE
267 | SYM_TRUE ',' SYM_FALSE
268 | SYM_FALSE ',' SYM_TRUE
269
270c_boolean: c_boolean_spec
271 | c_boolean_spec Semicolon_code boolean_value
272# | c_boolean_spec ';' error
273
274c_ordinal: c_ordinal_spec
275 | c_ordinal_spec Semicolon_code integer_value
276# | c_ordinal_spec ';' error
277
278c_ordinal_spec: ordinal
279 | c_ordinal_spec ',' ordinal
280
281ordinal: integer_value SYM_INTERVAL_DELIM V_QUALIFIED_TERM_CODE_REF
282
283c_code_phrase: V_TERM_CODE_CONSTRAINT #-- e.g. "[local::at0040, at0041; at0040]"
284 | V_QUALIFIED_TERM_CODE_REF
285
286# A Constraint_Ref is a proxy for a set of constraints on an object.
287constraint_ref: V_LOCAL_TERM_CODE_REF #-- e.g. "ac0003"
288
289any_identifier: type_identifier
290 | V_ATTRIBUTE_IDENTIFIER
291
292
293#----------------- TAKEN FROM DADL_VALIDATOR.Y -------------------
294#----------------- DO NOT MODIFY -------------------
295#---------------------- BASIC DATA VALUES -----------------------
296
297type_identifier: V_TYPE_IDENTIFIER
298 | V_GENERIC_TYPE_IDENTIFIER
299
300string_value: V_STRING
301
302string_list_value: V_STRING ',' V_STRING
303 | string_list_value ',' V_STRING
304 | V_STRING ',' SYM_LIST_CONTINUE
305
306integer_value: V_INTEGER
307 | '+' V_INTEGER
308 | '-' V_INTEGER
309
310integer_list_value: integer_value ',' integer_value
311 | integer_list_value ',' integer_value
312 | integer_value ',' SYM_LIST_CONTINUE
313
314integer_interval_value: SYM_INTERVAL_DELIM integer_value SYM_ELLIPSIS integer_value SYM_INTERVAL_DELIM
315 | SYM_INTERVAL_DELIM SYM_GT integer_value SYM_ELLIPSIS integer_value SYM_INTERVAL_DELIM
316 | SYM_INTERVAL_DELIM integer_value SYM_ELLIPSIS SYM_LT integer_value SYM_INTERVAL_DELIM
317 | SYM_INTERVAL_DELIM SYM_GT integer_value SYM_ELLIPSIS SYM_LT integer_value SYM_INTERVAL_DELIM
318 | SYM_INTERVAL_DELIM SYM_LT integer_value SYM_INTERVAL_DELIM
319 | SYM_INTERVAL_DELIM SYM_LE integer_value SYM_INTERVAL_DELIM
320 | SYM_INTERVAL_DELIM SYM_GT integer_value SYM_INTERVAL_DELIM
321 | SYM_INTERVAL_DELIM SYM_GE integer_value SYM_INTERVAL_DELIM
322 | SYM_INTERVAL_DELIM integer_value SYM_INTERVAL_DELIM
323
324real_value: V_REAL
325 | '+' V_REAL
326 | '-' V_REAL
327
328real_list_value: real_value ',' real_value
329 | real_list_value ',' real_value
330 | real_value ',' SYM_LIST_CONTINUE
331
332real_interval_value: SYM_INTERVAL_DELIM real_value SYM_ELLIPSIS real_value SYM_INTERVAL_DELIM
333 | SYM_INTERVAL_DELIM SYM_GT real_value SYM_ELLIPSIS real_value SYM_INTERVAL_DELIM
334 | SYM_INTERVAL_DELIM real_value SYM_ELLIPSIS SYM_LT real_value SYM_INTERVAL_DELIM
335 | SYM_INTERVAL_DELIM SYM_GT real_value SYM_ELLIPSIS SYM_LT real_value SYM_INTERVAL_DELIM
336 | SYM_INTERVAL_DELIM SYM_LT real_value SYM_INTERVAL_DELIM
337 | SYM_INTERVAL_DELIM SYM_LE real_value SYM_INTERVAL_DELIM
338 | SYM_INTERVAL_DELIM SYM_GT real_value SYM_INTERVAL_DELIM
339 | SYM_INTERVAL_DELIM SYM_GE real_value SYM_INTERVAL_DELIM
340 | SYM_INTERVAL_DELIM real_value SYM_INTERVAL_DELIM
341
342boolean_value: SYM_TRUE
343 | SYM_FALSE
344
345boolean_list_value: boolean_value ',' boolean_value
346 | boolean_list_value ',' boolean_value
347 | boolean_value ',' SYM_LIST_CONTINUE
348
349character_value: V_CHARACTER
350
351character_list_value: character_value ',' character_value
352 | character_list_value ',' character_value
353 | character_value ',' SYM_LIST_CONTINUE
354
355date_value: V_ISO8601_EXTENDED_DATE #-- in ISO8601 form yyyy-MM-dd
356
357date_list_value: date_value ',' date_value
358 | date_list_value ',' date_value
359 | date_value ',' SYM_LIST_CONTINUE
360
361date_interval_value: SYM_INTERVAL_DELIM date_value SYM_ELLIPSIS date_value SYM_INTERVAL_DELIM
362 | SYM_INTERVAL_DELIM SYM_GT date_value SYM_ELLIPSIS date_value SYM_INTERVAL_DELIM
363 | SYM_INTERVAL_DELIM date_value SYM_ELLIPSIS SYM_LT date_value SYM_INTERVAL_DELIM
364 | SYM_INTERVAL_DELIM SYM_GT date_value SYM_ELLIPSIS SYM_LT date_value SYM_INTERVAL_DELIM
365 | SYM_INTERVAL_DELIM SYM_LT date_value SYM_INTERVAL_DELIM
366 | SYM_INTERVAL_DELIM SYM_LE date_value SYM_INTERVAL_DELIM
367 | SYM_INTERVAL_DELIM SYM_GT date_value SYM_INTERVAL_DELIM
368 | SYM_INTERVAL_DELIM SYM_GE date_value SYM_INTERVAL_DELIM
369 | SYM_INTERVAL_DELIM date_value SYM_INTERVAL_DELIM
370
371time_value: V_ISO8601_EXTENDED_TIME
372
373time_list_value: time_value ',' time_value
374 | time_list_value ',' time_value
375 | time_value ',' SYM_LIST_CONTINUE
376
377time_interval_value: SYM_INTERVAL_DELIM time_value SYM_ELLIPSIS time_value SYM_INTERVAL_DELIM
378 | SYM_INTERVAL_DELIM SYM_GT time_value SYM_ELLIPSIS time_value SYM_INTERVAL_DELIM
379 | SYM_INTERVAL_DELIM time_value SYM_ELLIPSIS SYM_LT time_value SYM_INTERVAL_DELIM
380 | SYM_INTERVAL_DELIM SYM_GT time_value SYM_ELLIPSIS SYM_LT time_value SYM_INTERVAL_DELIM
381 | SYM_INTERVAL_DELIM SYM_LT time_value SYM_INTERVAL_DELIM
382 | SYM_INTERVAL_DELIM SYM_LE time_value SYM_INTERVAL_DELIM
383 | SYM_INTERVAL_DELIM SYM_GT time_value SYM_INTERVAL_DELIM
384 | SYM_INTERVAL_DELIM SYM_GE time_value SYM_INTERVAL_DELIM
385 | SYM_INTERVAL_DELIM time_value SYM_INTERVAL_DELIM
386
387date_time_value: V_ISO8601_EXTENDED_DATE_TIME
388
389date_time_list_value: date_time_value ',' date_time_value
390 | date_time_list_value ',' date_time_value
391 | date_time_value ',' SYM_LIST_CONTINUE
392
393date_time_interval_value: SYM_INTERVAL_DELIM date_time_value SYM_ELLIPSIS date_time_value SYM_INTERVAL_DELIM
394 | SYM_INTERVAL_DELIM SYM_GT date_time_value SYM_ELLIPSIS date_time_value SYM_INTERVAL_DELIM
395 | SYM_INTERVAL_DELIM date_time_value SYM_ELLIPSIS SYM_LT date_time_value SYM_INTERVAL_DELIM
396 | SYM_INTERVAL_DELIM SYM_GT date_time_value SYM_ELLIPSIS SYM_LT date_time_value SYM_INTERVAL_DELIM
397 | SYM_INTERVAL_DELIM SYM_LT date_time_value SYM_INTERVAL_DELIM
398 | SYM_INTERVAL_DELIM SYM_LE date_time_value SYM_INTERVAL_DELIM
399 | SYM_INTERVAL_DELIM SYM_GT date_time_value SYM_INTERVAL_DELIM
400 | SYM_INTERVAL_DELIM SYM_GE date_time_value SYM_INTERVAL_DELIM
401 | SYM_INTERVAL_DELIM date_time_value SYM_INTERVAL_DELIM
402
403duration_pattern: V_ISO8601_DURATION_CONSTRAINT_PATTERN
404
405duration_value: V_ISO8601_DURATION
406
407duration_list_value: duration_value ',' duration_value
408 | duration_list_value ',' duration_value
409 | duration_value ',' SYM_LIST_CONTINUE
410
411duration_interval_value: SYM_INTERVAL_DELIM duration_value SYM_ELLIPSIS duration_value SYM_INTERVAL_DELIM
412 | SYM_INTERVAL_DELIM SYM_GT duration_value SYM_ELLIPSIS duration_value SYM_INTERVAL_DELIM
413 | SYM_INTERVAL_DELIM duration_value SYM_ELLIPSIS SYM_LT duration_value SYM_INTERVAL_DELIM
414 | SYM_INTERVAL_DELIM SYM_GT duration_value SYM_ELLIPSIS SYM_LT duration_value SYM_INTERVAL_DELIM
415 | SYM_INTERVAL_DELIM SYM_LT duration_value SYM_INTERVAL_DELIM
416 | SYM_INTERVAL_DELIM SYM_LE duration_value SYM_INTERVAL_DELIM
417 | SYM_INTERVAL_DELIM SYM_GT duration_value SYM_INTERVAL_DELIM
418 | SYM_INTERVAL_DELIM SYM_GE duration_value SYM_INTERVAL_DELIM
419 | SYM_INTERVAL_DELIM duration_value SYM_INTERVAL_DELIM
420
421term_code: V_QUALIFIED_TERM_CODE_REF
422 | ERR_V_QUALIFIED_TERM_CODE_REF
423
424term_code_list_value: term_code ',' term_code
425 | term_code_list_value ',' term_code
426 | term_code ',' SYM_LIST_CONTINUE
427
428uri_value: V_URI
429
430
431---- header
432
433$:.unshift File.join(File.dirname(__FILE__))
434$DEBUG = false
435
436
437---- inner
438###----------/* keywords */ ---------------------------------------------
439@@reserved = {
440 'then' => :SYM_THEN,
441 'else' => :SYM_ELSE,
442 'and' => :SYM_AND,
443 'or' => :SYM_OR,
444 'xor' => :SYM_XOR,
445 'not' => :SYM_NOT,
446 'implies' => :SYM_IMPLIES,
447 'true' => :SYM_TRUE, #[Tt][Rr][Uu][Ee] -- -> SYM_TRUE
448 'false' => :SYM_FALSE, # [Ff][Aa][Ll][Ss][Ee] -- -> SYM_FALSE
449 'forall' => :SYM_FORALL,
450 'exists' => :SYM_EXISTS,
451 'existence' => :SYM_EXISTENCE,
452 'occurrences' => :SYM_OCCURRENCES,
453 'cardinality' => :SYM_CARDINALITY,
454 'ordered' => :SYM_ORDERED,
455 'unordered' => :SYM_UNORDERED,
456 'unique' => :SYM_UNIQUE,
457 'matches' => :SYM_MATCHES,
458 'is_in' => :SYM_MATCHES,
459 'invariant' => :SYM_INVARIANT,
460 'infinity' => :SYM_INFINITY, # [Ii][Nn][Ff][Ii][Nn][Ii][Tt][Yy] -- -> SYM_INFINITY
461 'use_archetype' => :SYM_ALLOW_ARCHETYPE,
462 'allow_archetype' => :SYM_ALLOW_ARCHETYPE,
463 'include' => :SYM_INCLUDE,
464 'exclude' => :SYM_EXCLUDE
465}
466
467###----------/* Scanner */ -----------------------------------------------
468
469def scan
470 until @data.nil? do
471 case @data
472 when /\A\n/ # carriage return
473 @lineno += 1
474 ;
475 when /\A[ \t\r\f]+/ #just drop it
476 ;
477 when /\A--.*\n/ # single line comment
478 @lineno += 1
479 ;
480 ###----------/* symbols */ -------------------------------------------------
481 when /\A\=/ # =
482 yield :SYM_EQ, :SYM_EQ
483 when /\A\>=/ # >=
484 yield :SYM_GE, :SYM_GE
485 when /\A\<=/ # <=
486 yield :SYM_LE, :SYM_LE
487 when /\A\</ # <
488 yield :SYM_LT, :SYM_LT
489 when /\A\>/ # >
490 yield :SYM_GT, :SYM_GT
491 when /\A\-/ # -
492 yield :Minus_code, :Minus_code
493 when /\A\+/ # +
494 yield :Plus_code, :Plus_code
495 when /\A\*/ # *
496 yield :Star_code, :Star_code
497 when /\A\// # /
498 yield :Slash_code, :Slash_code
499 when /\A\^/ # ^
500 yield :Caret_code, :Caret_code
501 when /\A\.\./ # ..
502 yield :SYM_ELLIPSIS, :SYM_ELLIPSIS
503 when /\A\./ # .
504 yield :Dot_code, :Dot_code
505 when /\A\;/ # ;
506 yield :Semicolon_code, :Semicolon_code
507 when /\A\,/ # ,
508 yield :Comma_code, :Comma_code
509 when /\A\:/ # :
510 yield :Colon_code, :Colon_code
511 when /\A\!/ # !
512 yield :Exclamation_code, :Exclamation_code
513 when /\A\(/ # (
514 yield :Left_parenthesis_code, :Left_parenthesis_code
515 when /\A\)/ # )
516 yield :Right_parenthesis_code, :Right_parenthesis_code
517 when /\A\{/ # {
518 yield :SYM_START_CBLOCK, :SYM_START_CBLOCK
519 when /\A\}/ # {
520 yield :SYM_END_CBLOCK, :SYM_END_CBLOCK
521 when /\A\$/ # $
522 yield :Dollar_code, :Dollar_code
523 when /\A\?\?/ # ??
524 yield :SYM_DT_UNKNOWN, :SYM_DT_UNKNOWN
525 when /\A\?/ # ?
526 yield :Question_mark_code, :Question_mark_code
527 when /\A\|/ # |
528 if @in_interval
529 @in_interval = false
530 elsif @start_block_received
531 @in_interval = true
532 @start_block_received = false
533 end
534 yield :SYM_INTERVAL_DELIM, :SYM_INTERVAL_DELIM
535 when /\A\[[a-zA-Z0-9._\-]+::[a-zA-Z0-9._\-]+\]/ #V_QUALIFIED_TERM_CODE_REF form [ICD10AM(1998)::F23]
536 yield :V_QUALIFIED_TERM_CODE_REF, $&
537 when /\A\[[a-zA-Z0-9._\- ]+::[a-zA-Z0-9._\- ]+\]/ #ERR_V_QUALIFIED_TERM_CODE_REF
538 yield :ERR_V_QUALIFIED_TERM_CODE_REF, $&
539 when /\A\[([a-zA-Z0-9()._\-]+::[a-zA-Z0-9._\_-]+)\]/
540 yield :V_TERM_CODE_CONSTRAINT, :V_TERM_CODE_CONSTRAINT
541 when /\A\[[a-zA-Z0-9][a-zA-Z0-9._\-]*\]/ #V_LOCAL_TERM_CODE_REF
542 yield :V_LOCAL_TERM_CODE_REF, $&
543 when /\A\[/ # [
544 yield :Left_bracket_code, :Left_bracket_code
545 when /\A\]/ # ]
546 yield :Right_bracket_code, :Right_bracket_code
547 when /\A\.../ # ...
548 yield :SYM_LIST_CONTINUE, :SYM_LIST_CONTINUE
549 when /\A[a-z][a-zA-Z0-9_]*/
550 word = $&.downcase
551 if @@reserved[word]
552 yield @@reserved[word], @@reserved[word]
553 else #V_ATTRIBUTE_IDENTIFIER /\A[a-z][a-zA-Z0-9_]*/
554 yield :V_ATTRIBUTE_IDENTIFIER, $&
555 end
556 when /\Aa[ct][0-9.]+/ #V_LOCAL_CODE
557 yield :V_LOCAL_CODE, $&
558 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-]-
559 yield :V_ISO8601_EXTENDED_DATE_TIME, $&
560 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]
561 yield :V_ISO8601_EXTENDED_TIME, $&
562 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
563 yield :V_ISO8601_EXTENDED_DATE, $&
564 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
565 yield :V_ISO8601_DURATION, $&
566 when /\A[yY][yY][yY][yY]-[mM?X][mM?X]-[dD?X][dD?X]/
567 yield :V_ISO8601_DATE_CONSTRAINT_PATTERN, $&
568 when /\A[hH][hH]:[mM?X][mM?X]:[sS?X][sS?X]/
569 yield :V_ISO8601_TIME_CONSTRAINT_PATTERN, $&
570 when /\A[yY][yY][yY][yY]-[mM?X][mM?X]-[dD?X][dD?X][\t][hH?X][hH?X]:[mM?X][mM?X]:[sS?X][sS?X]/
571 yield :V_ISO8601_DATE_TIME_CONSTRAINT_PATTERN, $&
572 when /\A[A-Z][a-zA-Z0-9_]*/
573 yield :V_TYPE_IDENTIFIER, $&
574 when /\A[a-z][a-zA-Z0-9_]*/
575 yield :V_ATTRIBUTE_IDENTIFIER, $&
576 when /\A[A-Z][a-zA-Z0-9_]*<[a-zA-Z0-9,_<>]+>/ #V_GENERIC_TYPE_IDENTIFIER
577 yield :V_GENERIC_TYPE_IDENTIFIER, $&
578 when /\A[0-9]+|[0-9]+[eE][+-]?[0-9]+/ #V_INTEGER
579 yield :V_INTEGER, $&
580 when /\A[0-9]+\.[0-9]+|[0-9]+\.[0-9]+[eE][+-]?[0-9]+ / #V_REAL
581 yield :V_REAL, $&
582# when /\A"((?:[^"\\]+|\\.)*)"/ #V_STRING
583 when /\A"([^"]*)"/m #V_STRING
584 yield :V_STRING, $1
585### when /\A{\// #V_REGEXP
586### if @in_regexp
587### @in_regexp = false
588### elsif @start_block_received
589### @in_interval = true
590### @start_block_received = false
591### end
592### yield :V_REGEXP, :V_REGEXP
593 when /\A[a-z]+:\/\/[^<>|\\{}^~"\[\] ]*/ #V_URI
594 yield :V_URI, $&
595 when /\A\S/ #UTF8CHAR
596 yield :UTF8CHAR, $&
597 end
598 @data = $' # variable $' receives the string after the match
599 end
600 yield :EOF, nil
601 yield false, '$'
602end # of scan
603
604
605def parse(data, filename, lineno = 1, debug = false)
606 @yydebug = true
607 @parsestring = data
608 @data = data
609 @lineno = lineno
610 @filename = filename
611 @in_interval = false
612 @start_block_received = false
613 @start_block_received = false
614 yyparse self, :scan
615end
616
617def on_error( t, v, values)
618 raise Racc::ParseError, "#{@filename}:#{@lineno}: Inline syntax error on #{v.inspect}"
619end
620
621# ###----------/* CADL Blocks */ -------------------------------------------
622# \{[^{}]* -- beginning of CADL block
623# <IN_CADL_BLOCK>\{[^{}]* -- got an open brace
624# <IN_CADL_BLOCK>[^{}]*\} -- got a close brace
625
626
627
628
629
630
631### Local Variables:
632### mode:ruby
633### mode:font-lock
634### comment-column:0
635### comment-start: "### "
636### comment-end:""
637### End:
638
639
640
641
Note: See TracBrowser for help on using the repository browser.