Ignore:
Timestamp:
Sep 24, 2009, 9:51:27 AM (15 years ago)
Author:
KOBAYASHI, Shinji
Message:

merged latest trunc change to branches/0.5

Location:
ruby/branches/0.5
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • ruby/branches/0.5

  • ruby/branches/0.5/lib/adl_parser/lib/parser.y

    r116 r290  
    4040   
    4141    archetype_id = val[0][:archetype_id]
     42    parent_archtype_id = val[1][:parent_archtype_id] if val[1]
    4243    adl_version = val[0][:arch_head][:arch_meta_data][:adl_version]
    4344    concept = val[2]
     
    4546    archetype = OpenEHR::AM::Archetype::ARCHETYPE.create(
    4647                                                         :archetype_id => archetype_id,
     48                                                         :parent_archtype_id => parent_archtype_id,
    4749                                                         :adl_version => adl_version,
    4850                                                         :concept => concept,
     
    5355      archetype.original_language = language
    5456    end
    55     @@log.info("#{__FILE__}:#{__LINE__}: archetype = #{archetype} at #{@filename}:#{@lineno}")
     57    @@logger.debug("#{__FILE__}:#{__LINE__}: archetype = #{archetype.to_yaml} at #{@filename}:#{@lineno}")
    5658    result = archetype
    5759  }
     
    104106arch_specialisation: #-- empty is ok
    105107  | SYM_SPECIALIZE V_ARCHETYPE_ID
     108  {
     109    result = {:parent_archtype_id => val[1]}
     110  }
    106111  | SYM_SPECIALIZE error
    107112
     
    150155  {
    151156    assert_at(__FILE__,__LINE__){val[0].instance_of?(OpenEHR::AM::Archetype::Constraint_Model::C_COMPLEX_OBJECT)}
    152     @@log.info("#{__FILE__}:#{__LINE__}: c_complex_object = #{val[0]} at #{@filename}:#{@lineno}")
     157    @@logger.debug("#{__FILE__}:#{__LINE__}: c_complex_object = #{val[0]} at #{@filename}:#{@lineno}")
    153158    result = val[0]
    154159  }
     
    201206
    202207#------------------------- node types -----------------------
    203 
    204 c_object: v_c_domain_type
    205   {
    206     result = val[0]
    207   }
    208   | c_complex_object
    209   {
    210     @@log.info("#{__FILE__}:#{__LINE__}: c_complex_object = #{val[0].inspect} at #{@filename}:#{@lineno}")
     208### http://www.openehr.org/svn/ref_impl_eiffel/TRUNK/components/adl_parser/src/syntax/cadl/parser/cadl_validator.html
     209### c_object:  c_complex_object
     210### | archetype_internal_ref
     211### | archetype_slot
     212### | constraint_ref
     213### | c_code_phrase
     214### | c_ordinal
     215### | c_primitive_object
     216### | V_C_DOMAIN_TYPE
     217### | ERR_C_DOMAIN_TYPE
     218### | error
     219c_object: c_complex_object
     220  {
     221    @@logger.debug("#{__FILE__}:#{__LINE__}: c_complex_object = #{val[0].inspect} at #{@filename}:#{@lineno}")
    211222    result = val[0]
    212223  }
     
    241252    result = val[0]
    242253  }
     254  | v_c_domain_type
     255  {
     256    result = val[0]
     257  }
     258
    243259#  | v_c_domain_type
    244260#  | V_C_DOMAIN_TYPE
     
    297313c_primitive: c_integer
    298314  {
    299     @@log.info("#{__FILE__}:#{__LINE__}: c_integer = #{val[0]} at #{@filename}:#{@lineno}")
     315    @@logger.debug("#{__FILE__}:#{__LINE__}: c_integer = #{val[0]} at #{@filename}:#{@lineno}")
    300316    result = OpenEHR::AM::Archetype::Constraint_Model::Primitive::C_INTEGER.create do |c_integer|
    301317      c_integer.list
     
    306322  | c_real
    307323  {
    308     @@log.info("#{__FILE__}:#{__LINE__}: c_real = #{val[0]} at #{@filename}:#{@lineno}")
     324    @@logger.debug("#{__FILE__}:#{__LINE__}: c_real = #{val[0]} at #{@filename}:#{@lineno}")
    309325    result = OpenEHR::AM::Archetype::Constraint_Model::Primitive::C_REAL.new
    310326  }
    311327  | c_date
    312328  {
    313     @@log.info("#{__FILE__}:#{__LINE__}: c_date = #{val[0]} at #{@filename}:#{@lineno}")
     329    @@logger.debug("#{__FILE__}:#{__LINE__}: c_date = #{val[0]} at #{@filename}:#{@lineno}")
    314330    result = OpenEHR::AM::Archetype::Constraint_Model::Primitive::C_DATE.new
    315331  }
    316332  | c_time
    317333  {
    318     @@log.info("#{__FILE__}:#{__LINE__}: c_time = #{val[0]} at #{@filename}:#{@lineno}")
     334    @@logger.debug("#{__FILE__}:#{__LINE__}: c_time = #{val[0]} at #{@filename}:#{@lineno}")
    319335    result = OpenEHR::AM::Archetype::Constraint_Model::Primitive::C_TIME.new
    320336  }
    321337  | c_date_time
    322338  {
    323     @@log.info("#{__FILE__}:#{__LINE__}: c_date_time = #{val[0]} at #{@filename}:#{@lineno}")
     339    @@logger.debug("#{__FILE__}:#{__LINE__}: c_date_time = #{val[0]} at #{@filename}:#{@lineno}")
    324340    result = OpenEHR::AM::Archetype::Constraint_Model::Primitive::C_DATE_TIME.new
    325341  }
    326342  | c_duration
    327343  {
    328     @@log.info("#{__FILE__}:#{__LINE__}: c_duration = #{val[0]} at #{@filename}:#{@lineno}")
     344    @@logger.debug("#{__FILE__}:#{__LINE__}: c_duration = #{val[0]} at #{@filename}:#{@lineno}")
    329345    result = OpenEHR::AM::Archetype::Constraint_Model::Primitive::C_DURATION.new
    330346  }
    331347  | c_string
    332348  {
    333     @@log.info("#{__FILE__}:#{__LINE__}: c_string = #{val[0]} at #{@filename}:#{@lineno}")
     349    @@logger.debug("#{__FILE__}:#{__LINE__}: c_string = #{val[0]} at #{@filename}:#{@lineno}")
    334350    result = OpenEHR::AM::Archetype::Constraint_Model::Primitive::C_STRING.new
    335351  }
     
    337353  {
    338354    assert_at(__FILE__,__LINE__){val[0].instance_of?(OpenEHR::AM::Archetype::Constraint_Model::Primitive::C_BOOLEAN)}
    339     @@log.info("#{__FILE__}:#{__LINE__}: c_boolean = #{val[0]} at #{@filename}:#{@lineno}")
     355    @@logger.debug("#{__FILE__}:#{__LINE__}: c_boolean = #{val[0]} at #{@filename}:#{@lineno}")
    340356    result = val[0]
    341357  }
     
    377393c_attr_head: V_ATTRIBUTE_IDENTIFIER c_existence
    378394  {
    379     @@log.info("#{__FILE__}:#{__LINE__}: V_ATTRIBUTE_IDENTIFIER = #{val[0]}, c_existence = #{val[1]} at #{@filename}")
     395    @@logger.debug("#{__FILE__}:#{__LINE__}: V_ATTRIBUTE_IDENTIFIER = #{val[0]}, c_existence = #{val[1]} at #{@filename}")
    380396    result = OpenEHR::AM::Archetype::Constraint_Model::C_SINGLE_ATTRIBUTE.new(
    381397                                                                              :rm_attribute_name => val[0],
     
    387403  {
    388404    assert_at(__FILE__,__LINE__){ val[2].instance_of?(OpenEHR::AM::Archetype::Constraint_Model::CARDINALITY) }
    389     @@log.info("#{__FILE__}:#{__LINE__}: V_ATTRIBUTE_IDENTIFIER: #{val[0]}, c_existence = #{val[1]}, c_cardinality = #{val[2]} at #{@filename}")
     405    @@logger.debug("#{__FILE__}:#{__LINE__}: V_ATTRIBUTE_IDENTIFIER: #{val[0]}, c_existence = #{val[1]}, c_cardinality = #{val[2]} at #{@filename}")
    390406    result = OpenEHR::AM::Archetype::Constraint_Model::C_MULTIPLE_ATTRIBUTE.new(
    391407                                                                                :rm_attribute_name => val[0],
     
    469485attr_val: attr_id SYM_EQ object_block
    470486  {
    471     @@log.info("#{__FILE__}:#{__LINE__}: attr_id = #{val[0]}, object_block = #{val[2]} at #{@filename}:#{@lineno}")
     487    @@logger.debug("#{__FILE__}:#{__LINE__}: attr_id = #{val[0]} at #{@filename}:#{@lineno}")
    472488    result = {:attr_id => val[0], :object_block => val[2]}
    473489  }
     
    475491attr_id: V_ATTRIBUTE_IDENTIFIER
    476492  {
    477     @@log.info("#{__FILE__}:#{__LINE__}: V_ATTRIBUTE_IDENTIFIER = #{val[0]} at #{@filename}:#{@lineno}")
     493    @@logger.debug("#{__FILE__}:#{__LINE__}: V_ATTRIBUTE_IDENTIFIER = #{val[0]} at #{@filename}:#{@lineno}")
    478494    result = val[0]
    479495  }
     
    514530multiple_attr_object_block_head: SYM_START_DBLOCK
    515531  {
    516     @@log.info("SYM_START_DBLOCK: #{val[0]} at #{@filename}:#{@lineno}")
    517532    result = val[0]
    518533  }
     
    529544keyed_object: object_key SYM_EQ object_block
    530545  {
    531     @@log.info("#{__FILE__}:#{__LINE__}: keyed_object = #{val[0]}, object_block = #{val[2]} at #{@filename}:#{@lineno}")
    532     result = {:object_key => val[0], :object_block => val[1]}
     546    @@logger.debug("#{__FILE__}:#{__LINE__}: keyed_object = #{val[0]} at #{@filename}:#{@lineno}")
     547    result = {:object_key => val[0], :object_block => val[2]}
    533548  }
    534549
    535550object_key: Left_bracket_code simple_value Right_bracket_code
    536551  {
    537     @@log.info("object_key: [#{val[1]}] at #{@filename}:#{@lineno}")
     552    @@logger.debug("object_key: [#{val[1]}] at #{@filename}:#{@lineno}")
    538553    result = val[1]
    539554  }
     
    548563  }
    549564
    550 untyped_single_attr_object_block: single_attr_object_complex_head SYM_END_DBLOCK # <>
    551   {
    552     @@log.info("#{__FILE__}:#{__LINE__}: single_attr_object_complex_head = #{val[0]} at #{@filename}:#{@lineno}")
     565untyped_single_attr_object_block: single_attr_object_complex_head SYM_END_DBLOCK # >
     566  {
     567    @@logger.debug("#{__FILE__}:#{__LINE__}: single_attr_object_complex_head = #{val[0]} at #{@filename}:#{@lineno}")
    553568    result = {:single_attr_object_complex_head => val[0]}
    554569  }
    555570  | single_attr_object_complex_head attr_vals SYM_END_DBLOCK
    556571  {
    557     @@log.info("#{__FILE__}:#{__LINE__}: single_attr_object_complex_head = #{val[0]}, attr_vals = #{val[1]} at #{@filename}:#{@lineno}")
     572    @@logger.debug("#{__FILE__}:#{__LINE__}: attr_vals = #{val[1]} at #{@filename}:#{@lineno}")
    558573    result = {:single_attr_object_complex_head => val[0], :attr_vals => val[1]}
    559574  }
     
    561576primitive_object_block: untyped_primitive_object_block
    562577  {
    563     @@log.info("#{__FILE__}:#{__LINE__}: untyped_primitive_object_block = #{val[0]} at #{@filename}:#{@lineno}")
     578    @@logger.debug("#{__FILE__}:#{__LINE__}: untyped_primitive_object_block = #{val[0]} at #{@filename}:#{@lineno}")
    564579    result = {:untyped_primitive_object_block => val[0]}
    565580  }
    566581  | type_identifier untyped_primitive_object_block
    567582  {
    568     @@log.info("#{__FILE__}:#{__LINE__}: type_identifier = #{val[0]}, untyped_primitive_object_block = #{val[1]} at #{@filename}:#{@lineno}")
     583    @@logger.debug("#{__FILE__}:#{__LINE__}: type_identifier = #{val[0]}, untyped_primitive_object_block = #{val[1]} at #{@filename}:#{@lineno}")
    569584    result = {:type_identifier => val[0], :untyped_primitive_object_block => val[1]}
    570585  }
    571586untyped_primitive_object_block: SYM_START_DBLOCK primitive_object_value SYM_END_DBLOCK
    572587  {
    573     @@log.info("#{__FILE__}:#{__LINE__}: primitive_object_block = <#{val[1]}> at #{@filename}:#{@lineno}")
     588    @@logger.debug("#{__FILE__}:#{__LINE__}: primitive_object_block = <#{val[1]}> at #{@filename}:#{@lineno}")
    574589    result = val[1]
    575590  }
     
    596611simple_value: string_value
    597612  {
    598     @@log.info("string_value: #{val[0]} at #{@filename}:#{@lineno}")
     613    @@logger.debug("string_value: #{val[0]} at #{@filename}:#{@lineno}")
    599614    result = val[0]
    600615  }
    601616  | integer_value
    602617  {
    603     @@log.info("integer_value: #{val[0]} at #{@filename}:#{@lineno}")
     618    @@logger.debug("integer_value: #{val[0]} at #{@filename}:#{@lineno}")
    604619    result = val[0]
    605620  }
    606621  | real_value
    607622  {
    608     @@log.info("real_value: #{val[0]} at #{@filename}:#{@lineno}")
     623    @@logger.debug("real_value: #{val[0]} at #{@filename}:#{@lineno}")
    609624    result = val[0]
    610625  }
    611626  | boolean_value
    612627  {
    613     @@log.info("boolean_value: #{val[0]} at #{@filename}:#{@lineno}")
     628    @@logger.debug("boolean_value: #{val[0]} at #{@filename}:#{@lineno}")
    614629    result = val[0]
    615630  }
    616631  | character_value
    617632  {
    618     @@log.info("character_value: #{val[0]} at #{@filename}:#{@lineno}")
     633    @@logger.debug("character_value: #{val[0]} at #{@filename}:#{@lineno}")
    619634    result = val[0]
    620635  }
    621636  | date_value
    622637  {
    623     @@log.info("date_value: #{val[0]} at #{@filename}:#{@lineno}")
     638    @@logger.debug("date_value: #{val[0]} at #{@filename}:#{@lineno}")
    624639    result = val[0]
    625640  }
    626641  | time_value
    627642  {
    628     @@log.info("time_value: #{val[0]} at #{@filename}:#{@lineno}")
     643    @@logger.debug("time_value: #{val[0]} at #{@filename}:#{@lineno}")
    629644    result = val[0]
    630645  }
    631646  | date_time_value
    632647  {
    633     @@log.info("date_time_value: #{val[0]} at #{@filename}:#{@lineno}")
     648    @@logger.debug("date_time_value: #{val[0]} at #{@filename}:#{@lineno}")
    634649    result = val[0]
    635650  }
    636651  | duration_value
    637652  {
    638     @@log.info("duration_value: #{val[0]} at #{@filename}:#{@lineno}")
     653    @@logger.debug("duration_value: #{val[0]} at #{@filename}:#{@lineno}")
    639654    result = val[0]
    640655  }
    641656  | uri_value
    642657  {
    643     @@log.info("uri_value: #{val[0]} at #{@filename}:#{@lineno}")
     658    @@logger.debug("uri_value: #{val[0]} at #{@filename}:#{@lineno}")
    644659    result = val[0]
    645660  }
     
    664679type_identifier: V_TYPE_IDENTIFIER
    665680  {
    666     @@log.info("V_TYPE_IDENTIFIER: #{val[0]} at #{@filename}:#{@lineno}")
     681    @@logger.debug("V_TYPE_IDENTIFIER: #{val[0]} at #{@filename}:#{@lineno}")
    667682    result = val[0]
    668683  }
    669684  | V_GENERIC_TYPE_IDENTIFIER
    670685  {
    671     @@log.info("V_GENERIC_TYPE_IDENTIFIER: #{val[0]} at #{@filename}:#{@lineno}")
     686    @@logger.debug("V_GENERIC_TYPE_IDENTIFIER: #{val[0]} at #{@filename}:#{@lineno}")
    672687    result = val[0]
    673688  }
     
    675690string_value: V_STRING
    676691  {
    677     @@log.info("V_STRING: #{val[0]} at #{@filename}:#{@lineno}")
     692    @@logger.debug("V_STRING: #{val[0]} at #{@filename}:#{@lineno}")
    678693    result = val[0]
    679694  }
     
    790805
    791806date_value: V_ISO8601_EXTENDED_DATE
     807  {
     808    result = val[0]
     809  }
    792810
    793811date_list_value: date_value Comma_code date_value
     
    839857duration_value: V_ISO8601_DURATION
    840858  {
    841     @@log.info("V_ISO8601_DURATION: #{val[0]} at #{@filename}:#{@lineno}")
     859    @@logger.debug("V_ISO8601_DURATION: #{val[0]} at #{@filename}:#{@lineno}")
    842860    result = val[0]
    843861  }
     
    859877term_code: V_QUALIFIED_TERM_CODE_REF
    860878  {
    861     @@log.info("#{__FILE__}:#{__LINE__}: V_QUALIFIED_TERM_CODE_REF = #{val[0]} at #{@filename}:#{@lineno}")
     879    @@logger.debug("#{__FILE__}:#{__LINE__}: V_QUALIFIED_TERM_CODE_REF = #{val[0]} at #{@filename}:#{@lineno}")
    862880    result = val[0]
    863881  }
     
    869887uri_value: V_URI
    870888  {
    871     @@log.info("#{__FILE__}:#{__LINE__}: V_URI = #{val[0]} at #{@filename}:#{@lineno}")
     889    @@logger.debug("#{__FILE__}:#{__LINE__}: V_URI = #{val[0]} at #{@filename}:#{@lineno}")
    872890    result = val[0]
    873891  }
     
    939957path_segment: V_ATTRIBUTE_IDENTIFIER V_LOCAL_TERM_CODE_REF
    940958  {
    941     @@log.info("#{__FILE__}:#{__LINE__}, V_ATTRIBUTE_IDENTIFIER = #{val[0]} at #{@filename}")
     959    @@logger.debug("#{__FILE__}:#{__LINE__}, V_ATTRIBUTE_IDENTIFIER = #{val[0]} at #{@filename}")
    942960  }
    943961  | V_ATTRIBUTE_IDENTIFIER
    944962  {
    945     @@log.info("#{__FILE__}:#{__LINE__}, V_ATTRIBUTE_IDENTIFIER = #{val[0]} at #{@filename}")
     963    @@logger.debug("#{__FILE__}:#{__LINE__}, V_ATTRIBUTE_IDENTIFIER = #{val[0]} at #{@filename}")
    946964  }
    947965
     
    11161134  {
    11171135    @in_interval = false
    1118     @@log.info("#{__FILE__}:#{__LINE__}, #{val[0]}|#{val[2]} at #{@filename}")
     1136    @@logger.debug("#{__FILE__}:#{__LINE__}, #{val[0]}|#{val[2]} at #{@filename}")
    11191137  }
    11201138
     
    11291147  }
    11301148
    1131 #term_code_constraint_section: START_TERM_CODE_CONSTRAINT term_code_body Right_bracket_code
     1149#                             [[a-zA-Z0-9\(\)\._\-]+::[ \t\n]*          [[a-zA-Z0-9\._\-]*[ \t]*]
    11321150term_code_constraint_section: START_TERM_CODE_CONSTRAINT term_code_body END_TERM_CODE_CONSTRAINT
     1151  {
     1152    @@logger.debug("#{__FILE__}:#{__LINE__}, START_TERM_CODE_CONSTRAINT = #{val[0]} at #{@filename}")
     1153    @@logger.debug("#{__FILE__}:#{__LINE__}, term_code_body = #{val[1]}")
     1154    @@logger.debug("#{__FILE__}:#{__LINE__}, END_TERM_CODE_CONSTRAINT = #{val[2]}")
     1155    result = val[1]
     1156  }
     1157
     1158
    11331159term_code_body: # empty
    11341160  | TERM_CODE
    11351161  | term_code_body TERM_CODE
    1136 ### term_code_constraint_section: START_TERM_CODE_CONSTRAINT term_code_body END_TERM_CODE_CONSTRAINT
    11371162### term_code_body: TERM_CODE
    11381163###   | term_code_body TERM_CODE
     
    11501175  | V_ATTRIBUTE_IDENTIFIER
    11511176  {
    1152     @@log.info("#{__FILE__}:#{__LINE__}, V_ATTRIBUTE_IDENTIFIER = #{word} at #{@filename}")
     1177    @@logger.debug("#{__FILE__}:#{__LINE__}, V_ATTRIBUTE_IDENTIFIER = #{word} at #{@filename}")
    11531178      result = val[0]
    11541179  }
     
    11711196$:.unshift File.join(File.dirname(__FILE__))
    11721197require 'logger'
    1173 #require 'lib/util.rb'
    1174 #require 'lib/scanner.rb'
    1175 require 'lib/adl_parser.rb'
     1198require 'yaml'
    11761199require 'rubygems'
     1200require 'adl_parser.rb'
    11771201require 'am.rb'
     1202require 'rm.rb'
    11781203$DEBUG = false
    11791204
     
    11891214
    11901215if $DEBUG
    1191   @@log = Logger.new('log/parser.log','daily')
    1192   @@log.level = Logger::INFO
     1216  @@logger = Logger.new('log/parser.log','daily')
     1217  @@logger.level = Logger::DEBUG
    11931218else
    1194   @@log = Logger.new(STDOUT)
    1195   @@log.level = Logger::WARN
     1219  @@logger = Logger.new(STDOUT)
     1220  @@logger.level = Logger::WARN
    11961221end
    11971222
    1198 @@dadl_scanner = OpenEHR::ADL::Scanner::DADL::RootScanner.new
    1199 @@cadl_scanner = OpenEHR::ADL::Scanner::CADL::RootScanner.new
    12001223
    12011224###----------/* keywords */ ---------------------------------------------
     
    12571280###----------/* Scanner */ -----------------------------------------------
    12581281
     1282
    12591283def scan
     1284  @@logger.debug("#{__FILE__}:#{__LINE__}: Entering scan at #{@filename}:#{@lineno}:")
     1285  scanner = OpenEHR::ADL::Scanner::ADLScanner.new(@adl_type, @filename)
     1286
    12601287  until @data.nil?  do
    1261     case @adl_type.last
    1262     when :adl
    1263       @data = scan_adl(@data) do |sym, val|
     1288    @data = scanner.scan(@data) do |sym, val|
    12641289        yield sym, val
    1265       end
    1266     when :dadl
    1267       @data = scan_dadl(@data) do |sym, val|
    1268         yield sym, val
    1269       end
    1270     when :cadl
    1271       @data = scan_cadl(@data) do |sym, val|
    1272         yield sym, val
    1273       end
    1274     when :regexp
    1275       @data = scan_regexp(@data) do |sym, val|
    1276         yield sym, val
    1277       end
    1278     else
    1279       raise
    12801290    end
    12811291    @data = $' # variable $' receives the string after the match
     
    12841294  yield false, '$'
    12851295end # of scan
    1286 
    1287 def scan_adl(data)
    1288   until data.nil?  do
    1289     case @adl_type.last
    1290     when :adl
    1291 #      puts "Entering scan_adl"
    1292       case data
    1293       when /\A\n/ # carriage return
    1294         @lineno += 1
    1295         ;
    1296       when /\A[ \t\r\f]+/ #just drop it
    1297         ;
    1298       when /\A--.*\n/ # single line comment
    1299         @lineno += 1
    1300         @@log.info("#{__FILE__}:#{__LINE__}: scan_adl: COMMENT = #{$&} at #{@filename}:#{@lineno}")
    1301         ;
    1302       when /\Adescription/   # description
    1303         yield :SYM_DESCRIPTION, :SYM_DESCRIPTION
    1304       when /\Adefinition/   # definition
    1305         yield :SYM_DEFINITION, :SYM_DEFINITION
    1306 #        @adl_type.push(:cadl)
    1307         ###----------/* symbols */ -------------------------------------------------
    1308       when /\A[A-Z][a-zA-Z0-9_]*/
    1309         yield :V_TYPE_IDENTIFIER, $&
    1310       when /\A[a-zA-Z][a-zA-Z0-9_-]+\.[a-zA-Z][a-zA-Z0-9_-]+\.[a-zA-Z0-9]+/   #V_ARCHETYPE_ID
    1311         yield :V_ARCHETYPE_ID, $&
    1312       when /\A[a-z][a-zA-Z0-9_]*/
    1313 #        word = $&.downcase
    1314         word = $&
    1315         if @@adl_reserved[word]
    1316           @@log.info("#{__FILE__}:#{__LINE__}: scan_adl: @@adl_reserved = #{@@adl_reserved[word]} at #{@filename}:#{@lineno}")
    1317           yield @@adl_reserved[word], @@adl_reserved[word]
    1318         elsif #/\A[A-Z][a-zA-Z0-9_]*/
    1319           @@log.info("#{__FILE__}:#{__LINE__}: scan_adl: V_ATTRIBUTE_IDENTIFIER = #{$&} at #{@filename}:#{@lineno}")
    1320           yield :V_ATTRIBUTE_IDENTIFIER, $&
    1321         end
    1322       when /\A\=/   # =
    1323         yield :SYM_EQ, :SYM_EQ
    1324       when /\A\>=/   # >=
    1325         yield :SYM_GE, :SYM_GE
    1326       when /\A\<=/   # <=
    1327         yield :SYM_LE, :SYM_LE
    1328       when /\A\</   # <
    1329         if @in_interval
    1330 #          @start_block_received = false
    1331           yield :SYM_LT, :SYM_LT
    1332         else
    1333 #          @start_block_received = true
    1334           @adl_type.push(:dadl)
    1335           yield :SYM_START_DBLOCK,  $&
    1336         end
    1337       when /\A\>/   # >
    1338         if @in_interval
    1339           yield :SYM_GT, :SYM_GT
    1340         else
    1341           adl_type = @adl_type.pop
    1342 #          puts "Escaping #{adl_type}"
    1343           assert_at(__FILE__,__LINE__){adl_type == :dadl}
    1344           yield :SYM_END_DBLOCK, :SYM_END_DBLOCK
    1345         end
    1346       when /\A\{/   # {
    1347         @adl_type.push(:cadl)
    1348         @@log.info("#{__FILE__}:#{__LINE__}: scan_cadl: entering cADL at #{@filename}:#{@lineno}")
    1349         yield :SYM_START_CBLOCK, :SYM_START_CBLOCK
    1350       when /\A\}/   # }
    1351         adl_type = @adl_type.pop
    1352 #        puts "Escaping #{adl_type}"
    1353         assert_at(__FILE__,__LINE__){adl_type == :cadl}
    1354         @@log.info("#{__FILE__}:#{__LINE__}: scan_cadl: exiting cADL at #{@filename}:#{@lineno}")
    1355         yield :SYM_END_CBLOCK, $&
    1356       when /\A\-/   # -
    1357         yield :Minus_code, :Minus_code
    1358       when /\A\+/   # +
    1359         yield :Plus_code, :Plus_code
    1360       when /\A\*/   # *
    1361         yield :Star_code, :Star_code
    1362       when /\A\//   # /
    1363         yield :Slash_code, :Slash_code
    1364       when /\A\^/   # ^
    1365         yield :Caret_code, :Caret_code
    1366       when /\A\=/   # =
    1367         yield :Equal_code, :Equal_code
    1368       when /\A\.\.\./   # ...
    1369         yield :SYM_LIST_CONTINUE, :SYM_LIST_CONTINUE
    1370       when /\A\.\./   # ..
    1371         yield :SYM_ELLIPSIS, :SYM_ELLIPSIS
    1372       when /\A\./   # .
    1373         yield :Dot_code, :Dot_code
    1374       when /\A\;/   # ;
    1375         yield :Semicolon_code, :Semicolon_code
    1376       when /\A\,/   # ,
    1377         yield :Comma_code, :Comma_code
    1378       when /\A\:/   # :
    1379         yield :Colon_code, :Colon_code
    1380       when /\A\!/   # !
    1381         yield :Exclamation_code, :Exclamation_code
    1382       when /\A\(/   # (
    1383         yield :Left_parenthesis_code, :Left_parenthesis_code
    1384       when /\A\)/   # )
    1385         yield :Right_parenthesis_code, :Right_parenthesis_code
    1386       when /\A\$/   # $
    1387         yield :Dollar_code, :Dollar_code
    1388       when /\A\?\?/   # ??
    1389         yield :SYM_DT_UNKNOWN, :SYM_DT_UNKNOWN
    1390       when /\A\?/   # ?
    1391         yield :Question_mark_code, :Question_mark_code
    1392       when /\A[0-9]+\.[0-9]+(\.[0-9]+)*/   # ?
    1393         yield :V_VERSION_STRING, :V_VERSION_STRING
    1394       when /\A\|/   # |
    1395         if @in_interval
    1396           @in_interval = false
    1397         else
    1398           @in_interval = true
    1399         end
    1400         yield :SYM_INTERVAL_DELIM, :SYM_INTERVAL_DELIM
    1401       when /\A\[[a-zA-Z0-9()\._-]+::[a-zA-Z0-9\._-]+\]/
    1402 #      when /\A\[[a-zA-Z0-9()\._-]+\:\:[a-zA-Z0-9\._-]+\]/   #V_QUALIFIED_TERM_CODE_REF form [ICD10AM(1998)::F23]
    1403         yield :V_QUALIFIED_TERM_CODE_REF, $&
    1404       when /\A\[[a-zA-Z0-9][a-zA-Z0-9._\-]*\]/   #V_LOCAL_TERM_CODE_REF
    1405         yield :V_LOCAL_TERM_CODE_REF, $&
    1406       when /\A\[/   # [
    1407         yield :Left_bracket_code, :Left_bracket_code
    1408       when /\A\]/   # ]
    1409         yield :Right_bracket_code, :Right_bracket_code
    1410 
    1411       when /\A\[[a-zA-Z0-9._\- ]+::[a-zA-Z0-9._\- ]+\]/   #ERR_V_QUALIFIED_TERM_CODE_REF
    1412         yield :ERR_V_QUALIFIED_TERM_CODE_REF, $&
    1413       when /\Aa[ct][0-9.]+/   #V_LOCAL_CODE
    1414         yield :V_LOCAL_CODE, $&
    1415       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-]-
    1416         yield :V_ISO8601_EXTENDED_DATE_TIME, $&
    1417       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]
    1418         yield :V_ISO8601_EXTENDED_TIME, $&
    1419       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
    1420         yield :V_ISO8601_EXTENDED_DATE, $&
    1421       when /\A[A-Z][a-zA-Z0-9_]*<[a-zA-Z0-9,_<>]+>/   #V_GENERIC_TYPE_IDENTIFIER
    1422         yield :V_GENERIC_TYPE_IDENTIFIER, $&
    1423       when /\A[0-9]+|[0-9]+[eE][+-]?[0-9]+/   #V_INTEGER
    1424         yield :V_INTEGER, $&
    1425       when /\A[0-9]+\.[0-9]+|[0-9]+\.[0-9]+[eE][+-]?[0-9]+ /   #V_REAL
    1426         yield :V_REAL, $&
    1427         #    when /\A"((?:[^"\\]+|\\.)*)"/ #V_STRING
    1428       when /\A"([^"]*)"/m #V_STRING
    1429         yield :V_STRING, $1
    1430       when /\A[a-z]+:\/\/[^<>|\\{}^~"\[\] ]*/ #V_URI
    1431         yield :V_URI, $&
    1432       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
    1433         yield :V_ISO8601_DURATION, $&
    1434       when /\A\S/ #UTF8CHAR
    1435         yield :UTF8CHAR, $&
    1436       end
    1437       data = $' # variable $' receives the string after the match
    1438     when :dadl
    1439 #      puts "Entering scan_dadl"
    1440       data = scan_dadl(data) do |sym, val|
    1441         yield sym, val
    1442       end
    1443     when :cadl
    1444 #      puts "Entering scan_cadl"
    1445       data = scan_cadl(data) do |sym, val|
    1446         yield sym, val
    1447       end
    1448     when :regexp
    1449 #      puts "Entering scan_regexp"
    1450       data = scan_regexp(data) do |sym, val|
    1451         yield sym, val
    1452       end
    1453     when :term_constraint
    1454 #      puts "Entering scan_term_constraint"
    1455       data = scan_term_constraint(data) do |sym, val|
    1456         yield sym, val
    1457       end
    1458     else
    1459       raise
    1460     end
    1461   end
    1462 end # scan_adl
    1463 
    1464 
    1465 def scan_cadl(data)
    1466   until data.nil?  do
    1467     case @adl_type.last
    1468     when :cadl
    1469 #      puts "Entering scan_cadl"
    1470       case scanned = @@cadl_scanner.parse(data)
    1471       when Yaparc::Result::OK
    1472         if scanned.value[0] == :START_V_C_DOMAIN_TYPE_BLOCK
    1473           @in_c_domain_type = true
    1474           @adl_type.push(:dadl)
    1475           yield scanned.value
    1476         else
    1477           yield scanned.value
    1478         end
    1479         data = scanned.input
    1480       end
    1481 
    1482       case data
    1483       when /\A\n/ # carriage return
    1484         @lineno += 1
    1485         ;
    1486       when /\A[ \t\r\f]+/ #just drop it
    1487         ;
    1488       when /\A--.*\n/ # single line comment
    1489         @lineno += 1
    1490         @@log.info("#{__FILE__}:#{__LINE__}: scan_cadl: COMMENT = #{$&} at #{@filename}:#{@lineno}")
    1491         ;
    1492         ###----------/* symbols */ -------------------------------------------------
    1493       when /\A\=/   # =
    1494         yield :SYM_EQ, :SYM_EQ
    1495       when /\A\>=/   # >=
    1496         yield :SYM_GE, :SYM_GE
    1497       when /\A\<=/   # <=
    1498         yield :SYM_LE, :SYM_LE
    1499 ###       when /\A[A-Z][a-zA-Z0-9_]*[ \n]*\</   # V_C_DOMAIN_TYPE
    1500 ###         @in_c_domain_type = true
    1501 ###         @adl_type.push(:dadl)
    1502 ###         yield :START_V_C_DOMAIN_TYPE_BLOCK, $&
    1503       when /\A\</   # <
    1504         if @in_interval
    1505           yield :SYM_LT, :SYM_LT
    1506         else
    1507           @adl_type.push(:dadl)
    1508           yield :SYM_START_DBLOCK,  $&
    1509         end
    1510       when /\A\>/   # >
    1511         if @in_interval
    1512           yield :SYM_GT, :SYM_GT
    1513         else
    1514           adl_type = @adl_type.pop
    1515 #          puts "Escaping #{adl_type}"
    1516           assert_at(__FILE__,__LINE__){adl_type == :dadl}
    1517           yield :SYM_END_DBLOCK, :SYM_END_DBLOCK
    1518         end
    1519       when /\A\-/   # -
    1520         yield :Minus_code, :Minus_code
    1521       when /\A\+/   # +
    1522         yield :Plus_code, :Plus_code
    1523       when /\A\*/   # *
    1524         yield :Star_code, :Star_code
    1525       when /\A\//   # /
    1526         yield :Slash_code, :Slash_code
    1527       when /\A\^/   # ^
    1528         yield :Caret_code, :Caret_code
    1529       when /\A\.\.\./   # ...
    1530         yield :SYM_LIST_CONTINUE, :SYM_LIST_CONTINUE
    1531       when /\A\.\./   # ..
    1532         yield :SYM_ELLIPSIS, :SYM_ELLIPSIS
    1533       when /\A\./   # .
    1534         yield :Dot_code, :Dot_code
    1535       when /\A\;/   # ;
    1536         yield :Semicolon_code, :Semicolon_code
    1537       when /\A\,/   # ,
    1538         yield :Comma_code, :Comma_code
    1539       when /\A\:/   # :
    1540         yield :Colon_code, :Colon_code
    1541       when /\A\!/   # !
    1542         yield :Exclamation_code, :Exclamation_code
    1543       when /\A\(/   # (
    1544         yield :Left_parenthesis_code, :Left_parenthesis_code
    1545       when /\A\)/   # )
    1546         yield :Right_parenthesis_code, :Right_parenthesis_code
    1547       when /\A\{\// #V_REGEXP
    1548         if @adl_type.last != :regexp
    1549           @in_regexp = true
    1550           @adl_type.push(:regexp)
    1551           yield :START_REGEXP_BLOCK, :START_REGEXP_BLOCK
    1552         else
    1553           raise
    1554         end
    1555 #        yield :V_REGEXP, :V_REGEXP
    1556       when /\A\{/   # {
    1557         @adl_type.push(:cadl)
    1558         @@log.info("#{__FILE__}:#{__LINE__}: scan_cadl: entering cADL at #{@filename}:#{@lineno}")
    1559         yield :SYM_START_CBLOCK, :SYM_START_CBLOCK
    1560       when /\A\}/   # }
    1561         adl_type = @adl_type.pop
    1562 #        puts "Escaping #{adl_type}"
    1563         assert_at(__FILE__,__LINE__){adl_type == :cadl}
    1564         @@log.info("#{__FILE__}:#{__LINE__}: scan_cadl: exiting cADL at #{@filename}:#{@lineno}")
    1565         yield :SYM_END_CBLOCK, :SYM_END_CBLOCK
    1566       when /\A\$/   # $
    1567         yield :Dollar_code, :Dollar_code
    1568       when /\A\?\?/   # ??
    1569         yield :SYM_DT_UNKNOWN, :SYM_DT_UNKNOWN
    1570       when /\A\?/   # ?
    1571         yield :Question_mark_code, :Question_mark_code
    1572       when /\A\|/   # |
    1573         @@log.info("#{__FILE__}:#{__LINE__}: scan_cadl: @in_interval = #{@in_interval} at #{@filename}:#{@lineno}")
    1574         if @in_interval
    1575           @in_interval = false
    1576         else
    1577 #          @in_interval = false
    1578           @in_interval = true
    1579         end
    1580         @@log.info("#{__FILE__}:#{__LINE__}: scan_cadl: SYM_INTERVAL_DELIM at #{@filename}:#{@lineno}")
    1581         yield :SYM_INTERVAL_DELIM, :SYM_INTERVAL_DELIM
    1582 
    1583       when /\A\[[a-zA-Z0-9._\-]+::[a-zA-Z0-9._\-]+\]/   #V_QUALIFIED_TERM_CODE_REF form [ICD10AM(1998)::F23]
    1584         yield :V_QUALIFIED_TERM_CODE_REF, $&
    1585       when /\A\[[a-zA-Z0-9._\- ]+::[a-zA-Z0-9._\- ]+\]/   #ERR_V_QUALIFIED_TERM_CODE_REF
    1586         yield :ERR_V_QUALIFIED_TERM_CODE_REF, $&
    1587       when /\A\[([a-zA-Z0-9()._\-]+::[a-zA-Z0-9._\_-]+)\]/
    1588         yield :V_TERM_CODE_CONSTRAINT, :V_TERM_CODE_CONSTRAINT
    1589       when /\A\[[a-zA-Z0-9\(\)\._\-]+::[ \t\n]*/
    1590         @adl_type.push(:term_constraint)
    1591         yield :START_TERM_CODE_CONSTRAINT, $&
    1592       when /\A\[[a-zA-Z0-9][a-zA-Z0-9._\-]*\]/   #V_LOCAL_TERM_CODE_REF
    1593         yield :V_LOCAL_TERM_CODE_REF, $&
    1594       when /\A\[/   # [
    1595         yield :Left_bracket_code, :Left_bracket_code
    1596       when /\A\]/   # ]
    1597         yield :Right_bracket_code, :Right_bracket_code
    1598       when /\A[A-Z][a-zA-Z0-9_]*<[a-zA-Z0-9,_<>]+>/   #V_GENERIC_TYPE_IDENTIFIER
    1599         yield :V_GENERIC_TYPE_IDENTIFIER, $&
    1600       when /\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]/
    1601         yield :V_ISO8601_DATE_TIME_CONSTRAINT_PATTERN, $&
    1602       when /\A[yY][yY][yY][yY]-[mM?X][mM?X]-[dD?X][dD?X]/
    1603         yield :V_ISO8601_DATE_CONSTRAINT_PATTERN, $&
    1604       when /\A[hH][hH]:[mM?X][mM?X]:[sS?X][sS?X]/
    1605         yield :V_ISO8601_TIME_CONSTRAINT_PATTERN, $&
    1606       when /\A[a-z][a-zA-Z0-9_]*/
    1607         word = $&.dup
    1608         if @@cadl_reserved[word.downcase]
    1609           yield @@cadl_reserved[word.downcase], @@cadl_reserved[word.downcase]
    1610         else
    1611           @@log.info("#{__FILE__}:#{__LINE__}: scan_cadl: V_ATTRIBUTE_IDENTIFIER = #{word} at #{@filename}:#{@lineno}")
    1612           yield :V_ATTRIBUTE_IDENTIFIER, word #V_ATTRIBUTE_IDENTIFIER /\A[a-z][a-zA-Z0-9_]*/
    1613         end
    1614       when /\A[A-Z][a-zA-Z0-9_]*/
    1615         word = $&.dup
    1616         if @@cadl_reserved[word.downcase]
    1617           yield @@cadl_reserved[word.downcase], @@cadl_reserved[word.downcase]
    1618         else
    1619           yield :V_TYPE_IDENTIFIER, $&
    1620         end
    1621       when /\Aa[ct][0-9.]+/   #V_LOCAL_CODE
    1622         yield :V_LOCAL_CODE, $&
    1623       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-]-
    1624         yield :V_ISO8601_EXTENDED_DATE_TIME, $&
    1625       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]
    1626         yield :V_ISO8601_EXTENDED_TIME, $&
    1627       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
    1628         yield :V_ISO8601_EXTENDED_DATE, $&
    1629       when /\A[0-9]+|[0-9]+[eE][+-]?[0-9]+/   #V_INTEGER
    1630         yield :V_INTEGER, $&
    1631       when /\A[0-9]+\.[0-9]+|[0-9]+\.[0-9]+[eE][+-]?[0-9]+ /   #V_REAL
    1632         yield :V_REAL, $&
    1633            when /\A"((?:[^"\\]+|\\.)*)"/ #V_STRING
    1634       when /\A"([^"]*)"/m #V_STRING
    1635         yield :V_STRING, $1
    1636       when /\A[a-z]+:\/\/[^<>|\\{}^~"\[\] ]*/ #V_URI
    1637         yield :V_URI, $&
    1638 ###       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
    1639 ###         yield :V_ISO8601_DURATION, $&
    1640       when /\A\S/ #UTF8CHAR
    1641         yield :UTF8CHAR, $&
    1642       else
    1643         raise
    1644       end
    1645       data = $' # variable $' receives the string after the match
    1646     when :adl
    1647 #      puts "Entering scan_adl"
    1648       data = scan_adl(data) do |sym, val|
    1649         yield sym, val
    1650       end
    1651     when :dadl
    1652 #      puts "Entering scan_dadl"
    1653       data = scan_dadl(data) do |sym, val|
    1654         yield sym, val
    1655       end
    1656     when :regexp
    1657 #      puts "Entering scan_regexp"
    1658       data = scan_regexp(data) do |sym, val|
    1659         yield sym, val
    1660       end
    1661     when :term_constraint
    1662 #      puts "Entering scan_term_constraint"
    1663       data = scan_term_constraint(data) do |sym, val|
    1664         yield sym, val
    1665       end
    1666     else
    1667       raise
    1668     end
    1669   end # of until
    1670 end # of scan_cadl
    1671 
    1672 def scan_dadl(data)
    1673   until data.nil?  do
    1674     case @adl_type.last
    1675     when :dadl
    1676 #      puts "Entering scan_dadl"
    1677       case scanned = @@dadl_scanner.parse(data)
    1678       when Yaparc::Result::OK
    1679         yield scanned.value
    1680         data = scanned.input
    1681       else
    1682       end
    1683 
    1684       case data
    1685       when /\A\n/ # carriage return
    1686         @lineno += 1
    1687         ;
    1688       when /\A[ \t\r\f]+/ #just drop it
    1689         ;
    1690       when /\A--.*\n/ # single line comment
    1691         @lineno += 1
    1692         @@log.info("#{__FILE__}:#{__LINE__}: scan_dadl: COMMENT = #{$&} at #{@filename}:#{@lineno}")
    1693         ;
    1694         ###----------/* symbols */ -------------------------------------------------
    1695       when /\A\=/   # =
    1696         yield :SYM_EQ, :SYM_EQ
    1697       when /\A\>\=/   # >=
    1698         yield :SYM_GE, :SYM_GE
    1699       when /\A\<\=/   # <=
    1700         yield :SYM_LE, :SYM_LE
    1701       when /\A\</   # <
    1702         if @in_interval
    1703           yield :SYM_LT, :SYM_LT
    1704         else
    1705           @adl_type.push(:dadl)
    1706           yield :SYM_START_DBLOCK, :SYM_START_DBLOCK
    1707         end
    1708       when /\A\>/   # >
    1709         if @in_interval
    1710 #          @in_interval = false
    1711           yield :SYM_GT, :SYM_GT
    1712         elsif @in_c_domain_type == true
    1713           assert_at(__FILE__,__LINE__){@adl_type.last == :dadl}
    1714           adl_type = @adl_type.pop
    1715           if @adl_type.last == :cadl
    1716             @in_c_domain_type = false
    1717             yield :END_V_C_DOMAIN_TYPE_BLOCK, $&
    1718           else
    1719             yield :SYM_END_DBLOCK, $&
    1720           end
    1721         elsif @in_c_domain_type == false
    1722           adl_type = @adl_type.pop
    1723 #          puts "Escaping #{adl_type}"
    1724           assert_at(__FILE__,__LINE__){adl_type == :dadl}
    1725           yield :SYM_END_DBLOCK, $&
    1726         else
    1727           raise
    1728         end
    1729       when /\A\-/   # -
    1730         yield :Minus_code, :Minus_code
    1731       when /\A\+/   # +
    1732         yield :Plus_code, :Plus_code
    1733       when /\A\*/   # *
    1734         yield :Star_code, :Star_code
    1735       when /\A\//   # /
    1736         yield :Slash_code, :Slash_code
    1737       when /\A\^/   # ^
    1738         yield :Caret_code, :Caret_code
    1739       when /\A\.\.\./   # ...
    1740         yield :SYM_LIST_CONTINUE, :SYM_LIST_CONTINUE
    1741       when /\A\.\./   # ..
    1742         yield :SYM_ELLIPSIS, :SYM_ELLIPSIS
    1743       when /\A\./   # .
    1744         yield :Dot_code, :Dot_code
    1745       when /\A\;/   # ;
    1746         yield :Semicolon_code, :Semicolon_code
    1747       when /\A\,/   # ,
    1748         yield :Comma_code, :Comma_code
    1749       when /\A\:/   # :
    1750         yield :Colon_code, :Colon_code
    1751       when /\A\!/   # !
    1752         yield :Exclamation_code, :Exclamation_code
    1753       when /\A\(/   # (
    1754         yield :Left_parenthesis_code, :Left_parenthesis_code
    1755       when /\A\)/   # )
    1756         yield :Right_parenthesis_code, :Right_parenthesis_code
    1757       when /\A\$/   # $
    1758         yield :Dollar_code, :Dollar_code
    1759       when /\A\?\?/   # ??
    1760         yield :SYM_DT_UNKNOWN, :SYM_DT_UNKNOWN
    1761       when /\A\?/   # ?
    1762         yield :Question_mark_code, :Question_mark_code
    1763       when /\A\|/   # |
    1764         @@log.info("#{__FILE__}:#{__LINE__}: scan_dadl: @in_interval = #{@in_interval} at #{@filename}:#{@lineno}")
    1765         if @in_interval
    1766           @in_interval = false
    1767         else
    1768 #          @in_interval = false
    1769           @in_interval = true
    1770         end
    1771         @@log.info("#{__FILE__}:#{__LINE__}: scan_dadl: SYM_INTERVAL_DELIM at #{@filename}:#{@lineno}")
    1772         yield :SYM_INTERVAL_DELIM, :SYM_INTERVAL_DELIM
    1773 ###       when /\A\[[a-zA-Z0-9()\._-]+::[a-zA-Z0-9\._-]+\]/   #V_QUALIFIED_TERM_CODE_REF form [ICD10AM(1998)::F23]
    1774 ###         yield :V_QUALIFIED_TERM_CODE_REF, $&
    1775 ###       when /\A\[[a-zA-Z0-9][a-zA-Z0-9._\-]*\]/   #V_LOCAL_TERM_CODE_REF
    1776 ###         yield :V_LOCAL_TERM_CODE_REF, $&
    1777 ###       when /\A\[[a-zA-Z0-9._\- ]+::[a-zA-Z0-9._\- ]+\]/   #ERR_V_QUALIFIED_TERM_CODE_REF
    1778 ###         yield :ERR_V_QUALIFIED_TERM_CODE_REF, $&
    1779       when /\A\[/   # [
    1780         yield :Left_bracket_code, :Left_bracket_code
    1781       when /\A\]/   # ]
    1782         yield :Right_bracket_code, :Right_bracket_code
    1783 ###       when /\A[A-Z][a-zA-Z0-9_-]*/
    1784 ###         yield :V_TYPE_IDENTIFIER, $&
    1785 ###       when /\A[A-Z][a-zA-Z0-9_]*<[a-zA-Z0-9,_<>]+>/   #V_GENERIC_TYPE_IDENTIFIER
    1786 ###         yield :V_GENERIC_TYPE_IDENTIFIER, $&
    1787 ###       when /\A[a-z][a-zA-Z0-9_]*/
    1788 ###         word = $&.downcase
    1789 ###         if @@dadl_reserved[word]
    1790 ###           yield @@dadl_reserved[word], @@dadl_reserved[word]
    1791 ###         else
    1792 ###           yield :V_ATTRIBUTE_IDENTIFIER, $&
    1793 ###         end
    1794 ###       when /\Aa[ct][0-9.]+/   #V_LOCAL_CODE
    1795 ###         yield :V_LOCAL_CODE, $&
    1796       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-]-
    1797         yield :V_ISO8601_EXTENDED_DATE_TIME, $&
    1798       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]
    1799         yield :V_ISO8601_EXTENDED_TIME, $&
    1800       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
    1801         yield :V_ISO8601_EXTENDED_DATE, $&
    1802       when /\A[A-Z][a-zA-Z0-9_]*<[a-zA-Z0-9,_<>]+>/   #V_GENERIC_TYPE_IDENTIFIER
    1803         yield :V_GENERIC_TYPE_IDENTIFIER, $&
    1804       when /\A[0-9]+|[0-9]+[eE][+-]?[0-9]+/   #V_INTEGER
    1805         yield :V_INTEGER, $&
    1806 ###       when /\A[0-9]+\.[0-9]+|[0-9]+\.[0-9]+[eE][+-]?[0-9]+ /   #V_REAL
    1807 ###         yield :V_REAL, $&
    1808         #    when /\A"((?:[^"\\]+|\\.)*)"/ #V_STRING
    1809 ###       when /\A"([^"]*)"/m #V_STRING
    1810 ###         yield :V_STRING, $1
    1811       when /\A[a-z]+:\/\/[^<>|\\{}^~"\[\] ]*/ #V_URI
    1812         yield :V_URI, $&
    1813 ###       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
    1814 ###         yield :V_ISO8601_DURATION, $&
    1815       when /\A\S/ #UTF8CHAR
    1816         yield :UTF8CHAR, $&
    1817       end
    1818       data = $' # variable $' receives the string after the match
    1819     when :adl
    1820 #      puts "Entering scan_adl"
    1821       data = scan_adl(data) do |sym, val|
    1822         yield sym, val
    1823       end
    1824     when :cadl
    1825 #      puts "Entering scan_cadl"
    1826       data = scan_cadl(data) do |sym, val|
    1827         yield sym, val
    1828       end
    1829     when :regexp
    1830 #      puts "Entering scan_regexp"
    1831       data = scan_regexp(data) do |sym, val|
    1832         yield sym, val
    1833       end
    1834     when :term_constraint
    1835 #      puts "Entering scan_term_constraint"
    1836       data = scan_term_constraint(data) do |sym, val|
    1837         yield sym, val
    1838       end
    1839     else
    1840       raise
    1841     end
    1842   end
    1843 end # of scan_dadl
    1844 
    1845 def scan_regexp(data)
    1846   until data.nil?  do
    1847     case @adl_type.last
    1848     when :regexp
    1849 #      puts "Entering scan_regexp"
    1850       case data
    1851       when /\A\/\}/ #V_REGEXP
    1852         if @adl_type.last == :regexp
    1853           @in_regexp = false
    1854           @adl_type.pop
    1855           yield :END_REGEXP_BLOCK, :END_REGEXP_BLOCK
    1856         else
    1857           raise
    1858         end
    1859       when /\A(.*)(\/\})/ #V_REGEXP
    1860         yield :REGEXP_BODY, $1
    1861         if @adl_type.last == :regexp
    1862           @in_regexp = false
    1863           @adl_type.pop
    1864           yield :END_REGEXP_BLOCK, :END_REGEXP_BLOCK
    1865         else
    1866           raise
    1867         end
    1868       else
    1869         raise data
    1870       end
    1871       data = $' # variable $' receives the string after the match
    1872     when :adl
    1873 #      puts "Entering scan_adl"
    1874       data = scan_adl(data) do |sym, val|
    1875         yield sym, val
    1876       end
    1877     when :dadl
    1878 #      puts "Entering scan_dadl"
    1879       data = scan_dadl(data) do |sym, val|
    1880         yield sym, val
    1881       end
    1882     when :cadl
    1883 #      puts "Entering scan_cadl"
    1884       data = scan_cadl(data) do |sym, val|
    1885         yield sym, val
    1886       end
    1887     when :term_constraint
    1888 #      puts "Entering scan_term_constraint"
    1889       data = scan_term_constraint(data) do |sym, val|
    1890         yield sym, val
    1891       end
    1892     else
    1893       raise
    1894     end
    1895   end
    1896 end # of scan_regexp
    1897 
    1898 def scan_term_constraint(data)
    1899   until data.nil?  do
    1900     case @adl_type.last
    1901     when :term_constraint
    1902 #      puts "Entering scan_term_constraint"
    1903       case data
    1904       when /\A\n/ # carriage return
    1905         @lineno += 1
    1906         ;
    1907       when /\A[ \t\r\f]+/ #just drop it
    1908         ;
    1909       when /\A--.*$/ # single line comment
    1910         @lineno += 1
    1911         @@log.info("#{__FILE__}:#{__LINE__}: scan_term_constraint: COMMENT = #{$&} at #{@filename}:#{@lineno}")
    1912         ;
    1913       when /\A[a-zA-Z0-9\._\-]+[ \t]*,/ # match any line, with ',' termination
    1914         yield :TERM_CODE, $&
    1915       when /\A[a-zA-Z0-9\._\-]+[ \t]*;/ #match second last line with ';' termination (assumed value)
    1916         yield :TERM_CODE, $&
    1917 #      when /\A[a-zA-Z0-9\._\-]+[ \t]*\]/ # match final line, terminating in ']'
    1918       when /\A[a-zA-Z0-9\._\-]*[ \t]*\]/ # match final line, terminating in ']'
    1919         adl_type = @adl_type.pop
    1920         assert_at(__FILE__,__LINE__){adl_type == :term_constraint}
    1921         yield :END_TERM_CODE_CONSTRAINT, $&
    1922       else
    1923         raise "data = #{data}"
    1924       end
    1925       data = $' # variable $' receives the string after the match
    1926     when :adl
    1927 #      puts "Entering scan_adl"
    1928       data = scan_adl(data) do |sym, val|
    1929         yield sym, val
    1930       end
    1931     when :dadl
    1932 #      puts "Entering scan_dadl"
    1933       data = scan_dadl(data) do |sym, val|
    1934         yield sym, val
    1935       end
    1936     when :cadl
    1937 #      puts "Entering scan_cadl"
    1938       data = scan_cadl(data) do |sym, val|
    1939         yield sym, val
    1940       end
    1941     else
    1942       raise
    1943     end
    1944   end
    1945 end # of scan_term_constraint
    19461296
    19471297
     
    19641314
    19651315
    1966 
     1316__END__
    19671317
    19681318
Note: See TracChangeset for help on using the changeset viewer.