Changeset 314 for ruby/trunk


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

partially successful parsing V_C_DOMAIN_TYPE

Location:
ruby/trunk/lib/adl_parser
Files:
2 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)
  • ruby/trunk/lib/adl_parser/test/parser_test.rb

    r307 r314  
    183183
    184184# C_DV_QUANTITY parse error
    185 #   must "openEHR-EHR-CLUSTER.dimensions-circumference.v1.adl be properly parsed" do
    186 #     file =  File.read("#{TEST_ROOT_DIR}/adl/openEHR-EHR-CLUSTER.dimensions-circumference.v1.adl")
    187 #     assert_nothing_raised do
    188 #       ast = @parser.parse(file, 'openEHR-EHR-CLUSTER.dimensions-circumference.v1')
    189 #       assert_instance_of OpenEhr::RM::Support::Identification::ArchetypeID, ast.archetype_id
    190 #     end
    191 #   end
    192 
    193 #   must "openEHR-EHR-CLUSTER.dimensions.v1.adl be properly parsed" do
    194 #     file =  File.read("#{TEST_ROOT_DIR}/adl/openEHR-EHR-CLUSTER.dimensions.v1.adl")
    195 #     assert_nothing_raised do
    196 #       ast = @parser.parse(file, 'openEHR-EHR-CLUSTER.dimensions.v1')
    197 #       assert_instance_of OpenEhr::RM::Support::Identification::ArchetypeID, ast.archetype_id
    198 #     end
    199 #   end
    200 
    201 #   must "openEHR-EHR-CLUSTER.exam-fetus.v1.adl be properly parsed" do
    202 #     file =  File.read("#{TEST_ROOT_DIR}/adl/openEHR-EHR-CLUSTER.exam-fetus.v1.adl")
    203 #     assert_nothing_raised do
    204 #       ast = @parser.parse(file, 'openEHR-EHR-CLUSTER.exam-fetus.v1')
    205 #       assert_instance_of OpenEhr::RM::Support::Identification::ArchetypeID, ast.archetype_id
    206 #     end
    207 #   end
    208 
    209 #   must "openEHR-EHR-CLUSTER.exam-uterine_cervix.v1.adl be properly parsed" do
    210 #     file =  File.read("#{TEST_ROOT_DIR}/adl/openEHR-EHR-CLUSTER.exam-uterine_cervix.v1.adl")
    211 #     assert_nothing_raised do
    212 #       ast = @parser.parse(file, 'openEHR-EHR-CLUSTER.exam-uterine_cervix.v1')
    213 #       assert_instance_of OpenEhr::RM::Support::Identification::ArchetypeID, ast.archetype_id
    214 #     end
    215 #   end
    216 
    217 #   must "openEHR-EHR-EVALUATION.adverse.v1.adl be properly parsed" do
    218 #     file =  File.read("#{TEST_ROOT_DIR}/adl/openEHR-EHR-EVALUATION.adverse.v1.adl")
    219 #     assert_nothing_raised do
    220 #       ast = @parser.parse(file, 'openEHR-EHR-EVALUATION.adverse.v1')
    221 #       assert_instance_of OpenEhr::RM::Support::Identification::ArchetypeID, ast.archetype_id
    222 #     end
    223 #   end
    224 #   must "openEHR-EHR-OBSERVATION.body_mass_index.v1.adl be properly parsed" do
    225 #     file =  File.read("#{TEST_ROOT_DIR}/adl/openEHR-EHR-OBSERVATION.body_mass_index.v1.adl")
    226 #     assert_nothing_raised do
    227 #       ast = @parser.parse(file, 'openEHR-EHR-OBSERVATION.body_mass_index.v1')
    228 #       assert_instance_of OpenEhr::RM::Support::Identification::ArchetypeID, ast.archetype_id
    229 #     end
    230 #   end
     185  must "openEHR-EHR-CLUSTER.dimensions-circumference.v1.adl be properly parsed" do
     186    file =  File.read("#{TEST_ROOT_DIR}/adl/openEHR-EHR-CLUSTER.dimensions-circumference.v1.adl")
     187    assert_nothing_raised do
     188      ast = @parser.parse(file, 'openEHR-EHR-CLUSTER.dimensions-circumference.v1')
     189      assert_instance_of OpenEhr::RM::Support::Identification::ArchetypeID, ast.archetype_id
     190    end
     191  end
     192
     193  must "openEHR-EHR-CLUSTER.dimensions.v1.adl be properly parsed" do
     194    file =  File.read("#{TEST_ROOT_DIR}/adl/openEHR-EHR-CLUSTER.dimensions.v1.adl")
     195    assert_nothing_raised do
     196      ast = @parser.parse(file, 'openEHR-EHR-CLUSTER.dimensions.v1')
     197      assert_instance_of OpenEhr::RM::Support::Identification::ArchetypeID, ast.archetype_id
     198    end
     199  end
     200
     201  must "openEHR-EHR-CLUSTER.exam-fetus.v1.adl be properly parsed" do
     202    file =  File.read("#{TEST_ROOT_DIR}/adl/openEHR-EHR-CLUSTER.exam-fetus.v1.adl")
     203    assert_nothing_raised do
     204      ast = @parser.parse(file, 'openEHR-EHR-CLUSTER.exam-fetus.v1')
     205      assert_instance_of OpenEhr::RM::Support::Identification::ArchetypeID, ast.archetype_id
     206    end
     207  end
     208
     209  must "openEHR-EHR-CLUSTER.exam-uterine_cervix.v1.adl be properly parsed" do
     210    file =  File.read("#{TEST_ROOT_DIR}/adl/openEHR-EHR-CLUSTER.exam-uterine_cervix.v1.adl")
     211    assert_nothing_raised do
     212      ast = @parser.parse(file, 'openEHR-EHR-CLUSTER.exam-uterine_cervix.v1')
     213      assert_instance_of OpenEhr::RM::Support::Identification::ArchetypeID, ast.archetype_id
     214    end
     215  end
     216
     217  must "openEHR-EHR-EVALUATION.adverse.v1.adl be properly parsed" do
     218    file =  File.read("#{TEST_ROOT_DIR}/adl/openEHR-EHR-EVALUATION.adverse.v1.adl")
     219    assert_nothing_raised do
     220      ast = @parser.parse(file, 'openEHR-EHR-EVALUATION.adverse.v1')
     221      assert_instance_of OpenEhr::RM::Support::Identification::ArchetypeID, ast.archetype_id
     222    end
     223  end
     224  must "openEHR-EHR-OBSERVATION.body_mass_index.v1.adl be properly parsed" do
     225    file =  File.read("#{TEST_ROOT_DIR}/adl/openEHR-EHR-OBSERVATION.body_mass_index.v1.adl")
     226    assert_nothing_raised do
     227      ast = @parser.parse(file, 'openEHR-EHR-OBSERVATION.body_mass_index.v1')
     228      assert_instance_of OpenEhr::RM::Support::Identification::ArchetypeID, ast.archetype_id
     229    end
     230  end
    231231
    232232
Note: See TracChangeset for help on using the changeset viewer.