Ignore:
Timestamp:
Oct 12, 2009, 1:24:03 AM (15 years ago)
Author:
Tatsukawa, Akimichi
Message:

partially successful parsing V_C_DOMAIN_TYPE

File:
1 edited

Legend:

Unmodified
Added
Removed
  • ruby/trunk/lib/adl_parser/lib/adl_scanner.rb

    r313 r314  
    33require 'adl_parser.rb'
    44require 'open_ehr'
     5#require 'am.rb'
     6#require 'rm.rb'
    57require 'util.rb'
    68
     
    911  module ADL
    1012    module Scanner
    11       LOGGER = Logger.new('log/scanner.log')
     13#      LOGGER = Logger.new('log/scanner.log')
     14      LOGGER = Logger.new('log/parser.log')
    1215      LOGGER.level = Logger::DEBUG
    1316
     
    2528      end
    2629
    27       class RootScanner < Base
    28         def initialize(filename, lineno = 1)
    29           @current_scanner = ADLScanner.new
    30         end
    31 
    32         def scan(data)
    33           until data.nil?  do
    34             case @current_scanner
    35             when ADLScanner
    36               @current_scanner.scan(data)
    37             end
    38           end
    39         end         
    40       end
    41 
    4230      #
    4331      # ADLScanner
    4432      #
    4533      class ADLScanner < Base
    46         attr_accessor :adl_type, :lineno
     34        attr_accessor :adl_type, :lineno, :cadl_scanner, :dadl_scanner, :regex_scanner, :term_constraint_scanner
    4735
    4836        @@logger = OpenEhr::ADL::Scanner::LOGGER #Logger.new('log/scanner.log')
     
    6957          super(adl_type, filename, lineno)
    7058          @in_interval  = false
    71           @adl_type  = nil
    7259        end
    7360
     
    7865          @@logger.debug("#{__FILE__}:#{__LINE__}: Entering  ADLScanner#scan at #{@filename}:#{@lineno}: data = #{data.inspect}")
    7966          until data.nil?  do
    80             if @adl_type.nil?
     67            case @adl_type.last
     68            when :adl
    8169              case data
    8270              when /\A\n/ # carriage return
     
    9886              when /\A(\w+)-(\w+)-(\w+)\.(\w+)((?:-\w+)*)\.(v\w+)/   #V_ARCHETYPE_ID
    9987                object_id, rm_originator, rm_name, rm_entity, concept_name, specialisation, version_id = $&, $1, $2, $3, $4, $5, $6
     88                #archetype_id = OpenEhr::RM::Support::Identification::ArchetypeID.new(object_id, concept_name, rm_name, rm_entity, rm_originator, specialisation, version_id)
    10089                archetype_id = OpenEhr::RM::Support::Identification::ArchetypeID.new(:concept_name => concept_name, :rm_name => rm_name, :rm_entity => rm_entity, :rm_originator => :rm_originator, :specialisation => specialisation, :version_id => version_id)
    10190                yield :V_ARCHETYPE_ID, archetype_id
     
    119108                  yield :SYM_LT, :SYM_LT
    120109                else
    121                   @adl_type = OpenEhr::ADL::Scanner::DADLScanner.new(@filename, @lineno)
     110                  @adl_type.push(:dadl)
    122111                  yield :SYM_START_DBLOCK,  $&
    123112                end
     
    126115                  yield :SYM_GT, :SYM_GT
    127116                else
    128                   raise
    129117                  adl_type = @adl_type.pop
    130118                  assert_at(__FILE__,__LINE__){adl_type == :dadl}
     
    132120                end
    133121              when /\A\{/   # {
    134                 @adl_type = OpenEhr::ADL::Scanner::CADLScanner.new(@filename, @lineno)
     122                @adl_type.push(:cadl)
     123                @@logger.debug("ADLScanner#scan: SYM_START_CBLOCK")
    135124                yield :SYM_START_CBLOCK, :SYM_START_CBLOCK
    136125              when /\A\}/   # }
    137                 raise
    138126                adl_type = @adl_type.pop
    139127                assert_at(__FILE__,__LINE__){adl_type == :cadl}
     
    221209              end
    222210              data = $' # variable $' receives the string after the match
     211            when :dadl
     212              dadl_scanner = OpenEhr::ADL::Scanner::DADLScanner.new(@adl_type, @filename, @lineno)
     213              data = dadl_scanner.scan(data) do |sym, val|
     214                yield sym, val
     215              end
     216            when :cadl
     217              cadl_scanner = OpenEhr::ADL::Scanner::CADLScanner.new(@adl_type, @filename, @lineno)
     218              data = cadl_scanner.scan(data) do |sym, val|
     219                yield sym, val
     220              end
     221            when :regexp
     222              regex_scanner = OpenEhr::ADL::Scanner::RegexScanner.new(@adl_type, @filename, @lineno)
     223              data = regex_scanner.scan(data) do |sym, val|
     224                yield sym, val
     225              end
     226            when :term_constraint
     227              term_constraint_scanner = OpenEhr::ADL::Scanner::TermConstraintScanner.new(@adl_type, @filename, @lineno)
     228              data = term_constraint_scanner.scan(data) do |sym, val|
     229                yield sym, val
     230              end
    223231            else
    224               data = @adl_type.scan(data) do |sym, val|
    225                 yield sym, val
    226               end
     232              raise
    227233            end
    228234          end
     
    234240      #
    235241      class DADLScanner < Base
    236         attr_accessor :in_interval, :in_c_domain_type, :in_dblock
     242        attr_accessor :in_interval, :in_c_domain_type, :dblock_depth
    237243        @@logger = OpenEhr::ADL::Scanner::LOGGER #Logger.new('log/scanner.log')
    238244        RESERVED = {
     
    242248        }
    243249
    244         def initialize(filename, lineno = 1)
     250        def initialize(adl_type, filename, lineno = 1)
    245251          super(adl_type, filename, lineno)
    246252          @in_interval = false
    247253          @in_c_domain_type = false
    248           @in_dblock = true
    249           @adl_type = nil
     254          @dblock_depth = 0
    250255        end
    251256
     
    254259        #
    255260        def scan(data)
     261          @@logger.debug("Entering DADLScanner#scan at #{@filename}:#{@lineno}: @adl_type = #{@adl_type.inspect}, data = #{data.inspect}")
    256262          until data.nil?  do
    257             if @adl_type.nil?
     263            @@logger.debug("#{@filename}:#{@lineno}: DADLScanner#scan:loop data = #{data.inspect}")
     264            @@logger.debug("#{@filename}:#{@lineno}: DADLScanner#scan:loop self = \n#{self.to_yaml}")
     265            case @adl_type.last
     266            when :dadl
    258267              case data
    259268              when /\A\n/ # carriage return
     
    287296                  yield :SYM_LT, :SYM_LT
    288297                else
    289                   raise
    290                   @adl_type.push(:dadl)
     298                  unless @in_c_domain_type
     299                    @adl_type.push(:dadl)
     300                  else
     301                    @dblock_depth += 1
     302                  end
    291303                  yield :SYM_START_DBLOCK, :SYM_START_DBLOCK
    292304                end
     
    294306                if @in_interval
    295307                  yield :SYM_GT, :SYM_GT
    296                 elsif @in_c_domain_type == true
    297                   assert_at(__FILE__,__LINE__){@adl_type.last == :dadl}
    298                   adl_type = @adl_type.pop
    299                   if adl_type == :dadl
    300                     @in_c_domain_type = false
    301                     yield :END_V_C_DOMAIN_TYPE_BLOCK, :END_V_C_DOMAIN_TYPE_BLOCK
    302 #                    yield :SYM_END_DBLOCK, :SYM_END_DBLOCK
     308                else
     309                  if @in_c_domain_type
     310                    assert_at(__FILE__,__LINE__){@adl_type.last == :dadl}
     311                    @dblock_depth -= 1
     312                    if @dblock_depth < 0
     313                      @adl_type.pop
     314                      @in_c_domain_type = false
     315                      yield :END_V_C_DOMAIN_TYPE_BLOCK, :END_V_C_DOMAIN_TYPE_BLOCK
     316                    else
     317                      yield :SYM_END_DBLOCK, :SYM_END_DBLOCK
     318                    end
     319#                     adl_type = @adl_type.pop
     320#                     if adl_type == :dadl
     321#                       yield :SYM_END_DBLOCK, :SYM_END_DBLOCK
     322#                     else
     323#                       @in_c_domain_type = false
     324#                       yield :END_V_C_DOMAIN_TYPE_BLOCK, :END_V_C_DOMAIN_TYPE_BLOCK
     325#                     end
    303326                  else
    304                     yield :SYM_END_DBLOCK, :SYM_END_DBLOCK
     327                    adl_type = @adl_type.pop
     328                    assert_at(__FILE__,__LINE__){adl_type == :dadl}
     329                    yield :SYM_END_DBLOCK, $&
    305330                  end
    306                 elsif @in_c_domain_type == false
    307                   adl_type = @adl_type.pop
    308                   assert_at(__FILE__,__LINE__){adl_type == :dadl}
    309                   yield :SYM_END_DBLOCK, $&
    310                 else
    311                   raise
    312331                end
    313332              when /\A\-/   # -
     
    389408              end
    390409              data = $' # variable $' receives the string after the match
    391 
    392 
    393 
    394           until data.nil?  do
    395             case @adl_type.last
    396             when :dadl
    397410            when :adl
    398411              adl_scanner = OpenEhr::ADL::Scanner::ADLScanner.new(@adl_type, @filename, @lineno)
Note: See TracChangeset for help on using the changeset viewer.