class OpenEHR::CADLParser #options omit_action_call prechigh nonassoc UMINUS UPLUS # left '*' '/' left Star_code Slash_code left '+' '-' nonassoc SYM_EQ nonassoc SYM_NE nonassoc SYM_LT nonassoc SYM_START_DBLOCK nonassoc SYM_GT nonassoc SYM_END_DBLOCK nonassoc SYM_LE nonassoc SYM_GE preclow rule ### http://svn.openehr.org/ref_impl_eiffel/TRUNK/components/adl_parser/src/syntax/cadl/parser/cadl_validator.y cadl: input EOF input: c_complex_object | assertions # | error c_complex_object: c_complex_object_head SYM_MATCHES SYM_START_CBLOCK c_complex_object_body SYM_END_CBLOCK c_complex_object_head: c_complex_object_id c_occurrences c_complex_object_id: type_identifier | type_identifier V_LOCAL_TERM_CODE_REF c_complex_object_body: c_any #-- used to indicate that any value of a type is ok | c_attributes #------------------------- node types ----------------------- c_object: c_complex_object | archetype_internal_ref | archetype_slot | constraint_ref | c_code_phrase | c_ordinal | c_primitive_object | v_c_domain_type # | V_C_DOMAIN_TYPE | ERR_C_DOMAIN_TYPE | error # 'archetype_internal_ref' is a node that refers to a previously defined object node in the same archetype. archetype_internal_ref: SYM_USE_NODE type_identifier c_occurrences absolute_path | SYM_USE_NODE type_identifier error # 'archetype_slot' is a node whose statements define a constraint that determines which other archetypes may appear at that point in the current archetype. archetype_slot: c_archetype_slot_head SYM_MATCHES SYM_START_CBLOCK c_includes c_excludes SYM_END_CBLOCK c_archetype_slot_head: c_archetype_slot_id c_occurrences c_archetype_slot_id: SYM_ALLOW_ARCHETYPE type_identifier | SYM_ALLOW_ARCHETYPE type_identifier V_LOCAL_TERM_CODE_REF | SYM_ALLOW_ARCHETYPE error # 'c_primitive_object' is an node representing a constraint on a primitive object type. c_primitive_object: c_primitive c_primitive: c_integer | c_real | c_date | c_time | c_date_time | c_duration | c_string | c_boolean c_any: Star_code #c_any: '*' #---------------- BODY - relationships ---------------- c_attributes: c_attribute | c_attributes c_attribute # 'c_attribute' is a node representing a constraint on an attribute in an object model. c_attribute: c_attr_head SYM_MATCHES SYM_START_CBLOCK c_attr_values SYM_END_CBLOCK | c_attr_head SYM_MATCHES SYM_START_CBLOCK error SYM_END_CBLOCK c_attr_head: V_ATTRIBUTE_IDENTIFIER c_existence | V_ATTRIBUTE_IDENTIFIER c_existence c_cardinality c_attr_values: c_object | c_attr_values c_object | c_any # -- to allow a property to have any value c_includes: #-- Empty | SYM_INCLUDE assertions c_excludes: #-- Empty | SYM_EXCLUDE assertions #---------------------- ASSERTIONS ------------------------ assertions: assertion | assertions assertion assertion: any_identifier ':' boolean_expression | boolean_expression # | any_identifier ':' error #---------------------- expressions --------------------- boolean_expression: boolean_leaf | boolean_node boolean_node: SYM_EXISTS absolute_path # | SYM_EXISTS error | relative_path SYM_MATCHES SYM_START_CBLOCK c_primitive SYM_END_CBLOCK | SYM_NOT boolean_leaf | arithmetic_expression '=' arithmetic_expression | arithmetic_expression SYM_NE arithmetic_expression | arithmetic_expression SYM_LT arithmetic_expression | arithmetic_expression SYM_GT arithmetic_expression | arithmetic_expression SYM_LE arithmetic_expression | arithmetic_expression SYM_GE arithmetic_expression | boolean_expression SYM_AND boolean_expression | boolean_expression SYM_OR boolean_expression | boolean_expression SYM_XOR boolean_expression | boolean_expression SYM_IMPLIES boolean_expression boolean_leaf: Left_parenthesis_code boolean_expression Right_parenthesis_code | SYM_TRUE | SYM_FALSE arithmetic_expression: arithmetic_leaf | arithmetic_node arithmetic_node: arithmetic_expression '+' arithmetic_leaf | arithmetic_expression '-' arithmetic_leaf | arithmetic_expression Star_code arithmetic_leaf | arithmetic_expression Slash_code arithmetic_leaf | arithmetic_expression '^' arithmetic_leaf arithmetic_leaf: Left_parenthesis_code arithmetic_expression Right_parenthesis_code | integer_value | real_value | absolute_path #--------------- THE FOLLOWING SOURCE TAKEN FROM OG_PATH_VALIDATOR.Y - DO NOT MODIFY ------------- #--------------- except to remove movable_path ---------------------------------------------------- absolute_path: Slash_code | Slash_code relative_path | absolute_path Slash_code relative_path relative_path: path_segment | relative_path Slash_code path_segment path_segment: V_ATTRIBUTE_IDENTIFIER V_LOCAL_TERM_CODE_REF | V_ATTRIBUTE_IDENTIFIER #-------------------------------- END SOURCE TAKEN FROM OG_PATH_VALIDATOR.Y ---------------------- #---------------- existence, occurrences, cardinality ---------------- c_existence: #-- default to 1..1 | SYM_EXISTENCE SYM_MATCHES SYM_START_CBLOCK existence_spec SYM_END_CBLOCK existence_spec: V_INTEGER #-- can only be 0 or 1 | V_INTEGER SYM_ELLIPSIS V_INTEGER #-- can only be 0..0, 0..1, 1..1 c_cardinality: SYM_CARDINALITY SYM_MATCHES SYM_START_CBLOCK cardinality_spec SYM_END_CBLOCK cardinality_spec: occurrence_spec | occurrence_spec Semicolon_code SYM_ORDERED | occurrence_spec Semicolon_code SYM_UNORDERED | occurrence_spec Semicolon_code SYM_UNIQUE | occurrence_spec Semicolon_code SYM_ORDERED Semicolon_code SYM_UNIQUE | occurrence_spec Semicolon_code SYM_UNORDERED Semicolon_code SYM_UNIQUE | occurrence_spec Semicolon_code SYM_UNIQUE Semicolon_code SYM_ORDERED | occurrence_spec Semicolon_code SYM_UNIQUE Semicolon_code SYM_UNORDERED cardinality_limit_value: integer_value | Star_code # | '*' c_occurrences: #-- default to 1..1 | SYM_OCCURRENCES SYM_MATCHES SYM_START_CBLOCK occurrence_spec SYM_END_CBLOCK # | SYM_OCCURRENCES error occurrence_spec: cardinality_limit_value #-- single integer or '*' | V_INTEGER SYM_ELLIPSIS cardinality_limit_value #---------------------- leaf constraint types ----------------------- c_integer_spec: integer_value | integer_list_value | integer_interval_value c_integer: c_integer_spec | c_integer_spec Semicolon_code integer_value | c_integer_spec Semicolon_code error c_real_spec: real_value | real_list_value | real_interval_value c_real: c_real_spec | c_real_spec Semicolon_code real_value | c_real_spec Semicolon_code error c_date_constraint: V_ISO8601_DATE_CONSTRAINT_PATTERN | date_value | date_interval_value c_date: c_date_constraint | c_date_constraint Semicolon_code date_value | c_date_constraint Semicolon_code error c_time_constraint: V_ISO8601_TIME_CONSTRAINT_PATTERN | time_value | time_interval_value c_time: c_time_constraint | c_time_constraint Semicolon_code time_value | c_time_constraint Semicolon_code error c_date_time_constraint: V_ISO8601_DATE_TIME_CONSTRAINT_PATTERN | date_time_value | date_time_interval_value c_date_time: c_date_time_constraint | c_date_time_constraint Semicolon_code date_time_value | c_date_time_constraint Semicolon_code error c_duration_constraint: duration_pattern | duration_pattern Slash_code duration_interval_value | duration_value | duration_interval_value c_duration: c_duration_constraint | c_duration_constraint Semicolon_code duration_value | c_duration_constraint Semicolon_code error c_string_spec: V_STRING #-- single value, generates closed list | string_list_value #-- closed list | string_list_value ',' SYM_LIST_CONTINUE #-- open list | V_REGEXP #-- regular expression with "//" or "^^" delimiters c_string: c_string_spec | c_string_spec Semicolon_code string_value # | c_string_spec Semicolon_code error c_boolean_spec: SYM_TRUE | SYM_FALSE | SYM_TRUE ',' SYM_FALSE | SYM_FALSE ',' SYM_TRUE c_boolean: c_boolean_spec | c_boolean_spec Semicolon_code boolean_value # | c_boolean_spec ';' error c_ordinal: c_ordinal_spec | c_ordinal_spec Semicolon_code integer_value # | c_ordinal_spec ';' error c_ordinal_spec: ordinal | c_ordinal_spec ',' ordinal ordinal: integer_value SYM_INTERVAL_DELIM V_QUALIFIED_TERM_CODE_REF c_code_phrase: V_TERM_CODE_CONSTRAINT #-- e.g. "[local::at0040, at0041; at0040]" | V_QUALIFIED_TERM_CODE_REF # A Constraint_Ref is a proxy for a set of constraints on an object. constraint_ref: V_LOCAL_TERM_CODE_REF #-- e.g. "ac0003" any_identifier: type_identifier | V_ATTRIBUTE_IDENTIFIER #----------------- TAKEN FROM DADL_VALIDATOR.Y ------------------- #----------------- DO NOT MODIFY ------------------- #---------------------- BASIC DATA VALUES ----------------------- type_identifier: V_TYPE_IDENTIFIER | V_GENERIC_TYPE_IDENTIFIER string_value: V_STRING string_list_value: V_STRING ',' V_STRING | string_list_value ',' V_STRING | V_STRING ',' SYM_LIST_CONTINUE integer_value: V_INTEGER | '+' V_INTEGER | '-' V_INTEGER integer_list_value: integer_value ',' integer_value | integer_list_value ',' integer_value | integer_value ',' SYM_LIST_CONTINUE integer_interval_value: SYM_INTERVAL_DELIM integer_value SYM_ELLIPSIS integer_value SYM_INTERVAL_DELIM | SYM_INTERVAL_DELIM SYM_GT integer_value SYM_ELLIPSIS integer_value SYM_INTERVAL_DELIM | SYM_INTERVAL_DELIM integer_value SYM_ELLIPSIS SYM_LT integer_value SYM_INTERVAL_DELIM | SYM_INTERVAL_DELIM SYM_GT integer_value SYM_ELLIPSIS SYM_LT integer_value SYM_INTERVAL_DELIM | SYM_INTERVAL_DELIM SYM_LT integer_value SYM_INTERVAL_DELIM | SYM_INTERVAL_DELIM SYM_LE integer_value SYM_INTERVAL_DELIM | SYM_INTERVAL_DELIM SYM_GT integer_value SYM_INTERVAL_DELIM | SYM_INTERVAL_DELIM SYM_GE integer_value SYM_INTERVAL_DELIM | SYM_INTERVAL_DELIM integer_value SYM_INTERVAL_DELIM real_value: V_REAL | '+' V_REAL | '-' V_REAL real_list_value: real_value ',' real_value | real_list_value ',' real_value | real_value ',' SYM_LIST_CONTINUE real_interval_value: SYM_INTERVAL_DELIM real_value SYM_ELLIPSIS real_value SYM_INTERVAL_DELIM | SYM_INTERVAL_DELIM SYM_GT real_value SYM_ELLIPSIS real_value SYM_INTERVAL_DELIM | SYM_INTERVAL_DELIM real_value SYM_ELLIPSIS SYM_LT real_value SYM_INTERVAL_DELIM | SYM_INTERVAL_DELIM SYM_GT real_value SYM_ELLIPSIS SYM_LT real_value SYM_INTERVAL_DELIM | SYM_INTERVAL_DELIM SYM_LT real_value SYM_INTERVAL_DELIM | SYM_INTERVAL_DELIM SYM_LE real_value SYM_INTERVAL_DELIM | SYM_INTERVAL_DELIM SYM_GT real_value SYM_INTERVAL_DELIM | SYM_INTERVAL_DELIM SYM_GE real_value SYM_INTERVAL_DELIM | SYM_INTERVAL_DELIM real_value SYM_INTERVAL_DELIM boolean_value: SYM_TRUE | SYM_FALSE boolean_list_value: boolean_value ',' boolean_value | boolean_list_value ',' boolean_value | boolean_value ',' SYM_LIST_CONTINUE character_value: V_CHARACTER character_list_value: character_value ',' character_value | character_list_value ',' character_value | character_value ',' SYM_LIST_CONTINUE date_value: V_ISO8601_EXTENDED_DATE #-- in ISO8601 form yyyy-MM-dd date_list_value: date_value ',' date_value | date_list_value ',' date_value | date_value ',' SYM_LIST_CONTINUE date_interval_value: SYM_INTERVAL_DELIM date_value SYM_ELLIPSIS date_value SYM_INTERVAL_DELIM | SYM_INTERVAL_DELIM SYM_GT date_value SYM_ELLIPSIS date_value SYM_INTERVAL_DELIM | SYM_INTERVAL_DELIM date_value SYM_ELLIPSIS SYM_LT date_value SYM_INTERVAL_DELIM | SYM_INTERVAL_DELIM SYM_GT date_value SYM_ELLIPSIS SYM_LT date_value SYM_INTERVAL_DELIM | SYM_INTERVAL_DELIM SYM_LT date_value SYM_INTERVAL_DELIM | SYM_INTERVAL_DELIM SYM_LE date_value SYM_INTERVAL_DELIM | SYM_INTERVAL_DELIM SYM_GT date_value SYM_INTERVAL_DELIM | SYM_INTERVAL_DELIM SYM_GE date_value SYM_INTERVAL_DELIM | SYM_INTERVAL_DELIM date_value SYM_INTERVAL_DELIM time_value: V_ISO8601_EXTENDED_TIME time_list_value: time_value ',' time_value | time_list_value ',' time_value | time_value ',' SYM_LIST_CONTINUE time_interval_value: SYM_INTERVAL_DELIM time_value SYM_ELLIPSIS time_value SYM_INTERVAL_DELIM | SYM_INTERVAL_DELIM SYM_GT time_value SYM_ELLIPSIS time_value SYM_INTERVAL_DELIM | SYM_INTERVAL_DELIM time_value SYM_ELLIPSIS SYM_LT time_value SYM_INTERVAL_DELIM | SYM_INTERVAL_DELIM SYM_GT time_value SYM_ELLIPSIS SYM_LT time_value SYM_INTERVAL_DELIM | SYM_INTERVAL_DELIM SYM_LT time_value SYM_INTERVAL_DELIM | SYM_INTERVAL_DELIM SYM_LE time_value SYM_INTERVAL_DELIM | SYM_INTERVAL_DELIM SYM_GT time_value SYM_INTERVAL_DELIM | SYM_INTERVAL_DELIM SYM_GE time_value SYM_INTERVAL_DELIM | SYM_INTERVAL_DELIM time_value SYM_INTERVAL_DELIM date_time_value: V_ISO8601_EXTENDED_DATE_TIME date_time_list_value: date_time_value ',' date_time_value | date_time_list_value ',' date_time_value | date_time_value ',' SYM_LIST_CONTINUE date_time_interval_value: SYM_INTERVAL_DELIM date_time_value SYM_ELLIPSIS date_time_value SYM_INTERVAL_DELIM | SYM_INTERVAL_DELIM SYM_GT date_time_value SYM_ELLIPSIS date_time_value SYM_INTERVAL_DELIM | SYM_INTERVAL_DELIM date_time_value SYM_ELLIPSIS SYM_LT date_time_value SYM_INTERVAL_DELIM | SYM_INTERVAL_DELIM SYM_GT date_time_value SYM_ELLIPSIS SYM_LT date_time_value SYM_INTERVAL_DELIM | SYM_INTERVAL_DELIM SYM_LT date_time_value SYM_INTERVAL_DELIM | SYM_INTERVAL_DELIM SYM_LE date_time_value SYM_INTERVAL_DELIM | SYM_INTERVAL_DELIM SYM_GT date_time_value SYM_INTERVAL_DELIM | SYM_INTERVAL_DELIM SYM_GE date_time_value SYM_INTERVAL_DELIM | SYM_INTERVAL_DELIM date_time_value SYM_INTERVAL_DELIM duration_pattern: V_ISO8601_DURATION_CONSTRAINT_PATTERN duration_value: V_ISO8601_DURATION duration_list_value: duration_value ',' duration_value | duration_list_value ',' duration_value | duration_value ',' SYM_LIST_CONTINUE duration_interval_value: SYM_INTERVAL_DELIM duration_value SYM_ELLIPSIS duration_value SYM_INTERVAL_DELIM | SYM_INTERVAL_DELIM SYM_GT duration_value SYM_ELLIPSIS duration_value SYM_INTERVAL_DELIM | SYM_INTERVAL_DELIM duration_value SYM_ELLIPSIS SYM_LT duration_value SYM_INTERVAL_DELIM | SYM_INTERVAL_DELIM SYM_GT duration_value SYM_ELLIPSIS SYM_LT duration_value SYM_INTERVAL_DELIM | SYM_INTERVAL_DELIM SYM_LT duration_value SYM_INTERVAL_DELIM | SYM_INTERVAL_DELIM SYM_LE duration_value SYM_INTERVAL_DELIM | SYM_INTERVAL_DELIM SYM_GT duration_value SYM_INTERVAL_DELIM | SYM_INTERVAL_DELIM SYM_GE duration_value SYM_INTERVAL_DELIM | SYM_INTERVAL_DELIM duration_value SYM_INTERVAL_DELIM term_code: V_QUALIFIED_TERM_CODE_REF | ERR_V_QUALIFIED_TERM_CODE_REF term_code_list_value: term_code ',' term_code | term_code_list_value ',' term_code | term_code ',' SYM_LIST_CONTINUE uri_value: V_URI ---- header $:.unshift File.join(File.dirname(__FILE__)) $DEBUG = false ---- inner ###----------/* keywords */ --------------------------------------------- @@reserved = { 'then' => :SYM_THEN, 'else' => :SYM_ELSE, 'and' => :SYM_AND, 'or' => :SYM_OR, 'xor' => :SYM_XOR, 'not' => :SYM_NOT, 'implies' => :SYM_IMPLIES, 'true' => :SYM_TRUE, #[Tt][Rr][Uu][Ee] -- -> SYM_TRUE 'false' => :SYM_FALSE, # [Ff][Aa][Ll][Ss][Ee] -- -> SYM_FALSE 'forall' => :SYM_FORALL, 'exists' => :SYM_EXISTS, 'existence' => :SYM_EXISTENCE, 'occurrences' => :SYM_OCCURRENCES, 'cardinality' => :SYM_CARDINALITY, 'ordered' => :SYM_ORDERED, 'unordered' => :SYM_UNORDERED, 'unique' => :SYM_UNIQUE, 'matches' => :SYM_MATCHES, 'is_in' => :SYM_MATCHES, 'invariant' => :SYM_INVARIANT, 'infinity' => :SYM_INFINITY, # [Ii][Nn][Ff][Ii][Nn][Ii][Tt][Yy] -- -> SYM_INFINITY 'use_archetype' => :SYM_ALLOW_ARCHETYPE, 'allow_archetype' => :SYM_ALLOW_ARCHETYPE, 'include' => :SYM_INCLUDE, 'exclude' => :SYM_EXCLUDE } ###----------/* Scanner */ ----------------------------------------------- def scan until @data.nil? do case @data when /\A\n/ # carriage return @lineno += 1 ; when /\A[ \t\r\f]+/ #just drop it ; when /\A--.*\n/ # single line comment @lineno += 1 ; ###----------/* symbols */ ------------------------------------------------- when /\A\=/ # = yield :SYM_EQ, :SYM_EQ when /\A\>=/ # >= yield :SYM_GE, :SYM_GE when /\A\<=/ # <= yield :SYM_LE, :SYM_LE when /\A\/ # > yield :SYM_GT, :SYM_GT when /\A\-/ # - yield :Minus_code, :Minus_code when /\A\+/ # + yield :Plus_code, :Plus_code when /\A\*/ # * yield :Star_code, :Star_code when /\A\// # / yield :Slash_code, :Slash_code when /\A\^/ # ^ yield :Caret_code, :Caret_code when /\A\.\./ # .. yield :SYM_ELLIPSIS, :SYM_ELLIPSIS when /\A\./ # . yield :Dot_code, :Dot_code when /\A\;/ # ; yield :Semicolon_code, :Semicolon_code when /\A\,/ # , yield :Comma_code, :Comma_code when /\A\:/ # : yield :Colon_code, :Colon_code when /\A\!/ # ! yield :Exclamation_code, :Exclamation_code when /\A\(/ # ( yield :Left_parenthesis_code, :Left_parenthesis_code when /\A\)/ # ) yield :Right_parenthesis_code, :Right_parenthesis_code when /\A\{/ # { yield :SYM_START_CBLOCK, :SYM_START_CBLOCK when /\A\}/ # { yield :SYM_END_CBLOCK, :SYM_END_CBLOCK when /\A\$/ # $ yield :Dollar_code, :Dollar_code when /\A\?\?/ # ?? yield :SYM_DT_UNKNOWN, :SYM_DT_UNKNOWN when /\A\?/ # ? yield :Question_mark_code, :Question_mark_code when /\A\|/ # | if @in_interval @in_interval = false elsif @start_block_received @in_interval = true @start_block_received = false end yield :SYM_INTERVAL_DELIM, :SYM_INTERVAL_DELIM when /\A\[[a-zA-Z0-9._\-]+::[a-zA-Z0-9._\-]+\]/ #V_QUALIFIED_TERM_CODE_REF form [ICD10AM(1998)::F23] yield :V_QUALIFIED_TERM_CODE_REF, $& when /\A\[[a-zA-Z0-9._\- ]+::[a-zA-Z0-9._\- ]+\]/ #ERR_V_QUALIFIED_TERM_CODE_REF yield :ERR_V_QUALIFIED_TERM_CODE_REF, $& when /\A\[([a-zA-Z0-9()._\-]+::[a-zA-Z0-9._\_-]+)\]/ yield :V_TERM_CODE_CONSTRAINT, :V_TERM_CODE_CONSTRAINT when /\A\[[a-zA-Z0-9][a-zA-Z0-9._\-]*\]/ #V_LOCAL_TERM_CODE_REF yield :V_LOCAL_TERM_CODE_REF, $& when /\A\[/ # [ yield :Left_bracket_code, :Left_bracket_code when /\A\]/ # ] yield :Right_bracket_code, :Right_bracket_code when /\A\.../ # ... yield :SYM_LIST_CONTINUE, :SYM_LIST_CONTINUE when /\A[a-z][a-zA-Z0-9_]*/ word = $&.downcase if @@reserved[word] yield @@reserved[word], @@reserved[word] else #V_ATTRIBUTE_IDENTIFIER /\A[a-z][a-zA-Z0-9_]*/ yield :V_ATTRIBUTE_IDENTIFIER, $& end when /\Aa[ct][0-9.]+/ #V_LOCAL_CODE yield :V_LOCAL_CODE, $& 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-]- yield :V_ISO8601_EXTENDED_DATE_TIME, $& 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] yield :V_ISO8601_EXTENDED_TIME, $& 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 yield :V_ISO8601_EXTENDED_DATE, $& 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 yield :V_ISO8601_DURATION, $& when /\A[yY][yY][yY][yY]-[mM?X][mM?X]-[dD?X][dD?X]/ yield :V_ISO8601_DATE_CONSTRAINT_PATTERN, $& when /\A[hH][hH]:[mM?X][mM?X]:[sS?X][sS?X]/ yield :V_ISO8601_TIME_CONSTRAINT_PATTERN, $& 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]/ yield :V_ISO8601_DATE_TIME_CONSTRAINT_PATTERN, $& when /\A[A-Z][a-zA-Z0-9_]*/ yield :V_TYPE_IDENTIFIER, $& when /\A[a-z][a-zA-Z0-9_]*/ yield :V_ATTRIBUTE_IDENTIFIER, $& when /\A[A-Z][a-zA-Z0-9_]*<[a-zA-Z0-9,_<>]+>/ #V_GENERIC_TYPE_IDENTIFIER yield :V_GENERIC_TYPE_IDENTIFIER, $& when /\A[0-9]+|[0-9]+[eE][+-]?[0-9]+/ #V_INTEGER yield :V_INTEGER, $& when /\A[0-9]+\.[0-9]+|[0-9]+\.[0-9]+[eE][+-]?[0-9]+ / #V_REAL yield :V_REAL, $& # when /\A"((?:[^"\\]+|\\.)*)"/ #V_STRING when /\A"([^"]*)"/m #V_STRING yield :V_STRING, $1 ### when /\A{\// #V_REGEXP ### if @in_regexp ### @in_regexp = false ### elsif @start_block_received ### @in_interval = true ### @start_block_received = false ### end ### yield :V_REGEXP, :V_REGEXP when /\A[a-z]+:\/\/[^<>|\\{}^~"\[\] ]*/ #V_URI yield :V_URI, $& when /\A\S/ #UTF8CHAR yield :UTF8CHAR, $& end @data = $' # variable $' receives the string after the match end yield :EOF, nil yield false, '$' end # of scan def parse(data, filename, lineno = 1, debug = false) @yydebug = true @parsestring = data @data = data @lineno = lineno @filename = filename @in_interval = false @start_block_received = false @start_block_received = false yyparse self, :scan end def on_error( t, v, values) raise Racc::ParseError, "#{@filename}:#{@lineno}: Inline syntax error on #{v.inspect}" end # ###----------/* CADL Blocks */ ------------------------------------------- # \{[^{}]* -- beginning of CADL block # \{[^{}]* -- got an open brace # [^{}]*\} -- got a close brace ### Local Variables: ### mode:ruby ### mode:font-lock ### comment-column:0 ### comment-start: "### " ### comment-end:"" ### End: