Changeset 314 for ruby/trunk/lib/adl_parser
- Timestamp:
- Oct 12, 2009, 1:24:03 AM (15 years ago)
- Location:
- ruby/trunk/lib/adl_parser
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
ruby/trunk/lib/adl_parser/lib/adl_scanner.rb
r313 r314 3 3 require 'adl_parser.rb' 4 4 require 'open_ehr' 5 #require 'am.rb' 6 #require 'rm.rb' 5 7 require 'util.rb' 6 8 … … 9 11 module ADL 10 12 module Scanner 11 LOGGER = Logger.new('log/scanner.log') 13 # LOGGER = Logger.new('log/scanner.log') 14 LOGGER = Logger.new('log/parser.log') 12 15 LOGGER.level = Logger::DEBUG 13 16 … … 25 28 end 26 29 27 class RootScanner < Base28 def initialize(filename, lineno = 1)29 @current_scanner = ADLScanner.new30 end31 32 def scan(data)33 until data.nil? do34 case @current_scanner35 when ADLScanner36 @current_scanner.scan(data)37 end38 end39 end40 end41 42 30 # 43 31 # ADLScanner 44 32 # 45 33 class ADLScanner < Base 46 attr_accessor :adl_type, :lineno 34 attr_accessor :adl_type, :lineno, :cadl_scanner, :dadl_scanner, :regex_scanner, :term_constraint_scanner 47 35 48 36 @@logger = OpenEhr::ADL::Scanner::LOGGER #Logger.new('log/scanner.log') … … 69 57 super(adl_type, filename, lineno) 70 58 @in_interval = false 71 @adl_type = nil72 59 end 73 60 … … 78 65 @@logger.debug("#{__FILE__}:#{__LINE__}: Entering ADLScanner#scan at #{@filename}:#{@lineno}: data = #{data.inspect}") 79 66 until data.nil? do 80 if @adl_type.nil? 67 case @adl_type.last 68 when :adl 81 69 case data 82 70 when /\A\n/ # carriage return … … 98 86 when /\A(\w+)-(\w+)-(\w+)\.(\w+)((?:-\w+)*)\.(v\w+)/ #V_ARCHETYPE_ID 99 87 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) 100 89 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) 101 90 yield :V_ARCHETYPE_ID, archetype_id … … 119 108 yield :SYM_LT, :SYM_LT 120 109 else 121 @adl_type = OpenEhr::ADL::Scanner::DADLScanner.new(@filename, @lineno)110 @adl_type.push(:dadl) 122 111 yield :SYM_START_DBLOCK, $& 123 112 end … … 126 115 yield :SYM_GT, :SYM_GT 127 116 else 128 raise129 117 adl_type = @adl_type.pop 130 118 assert_at(__FILE__,__LINE__){adl_type == :dadl} … … 132 120 end 133 121 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") 135 124 yield :SYM_START_CBLOCK, :SYM_START_CBLOCK 136 125 when /\A\}/ # } 137 raise138 126 adl_type = @adl_type.pop 139 127 assert_at(__FILE__,__LINE__){adl_type == :cadl} … … 221 209 end 222 210 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 223 231 else 224 data = @adl_type.scan(data) do |sym, val| 225 yield sym, val 226 end 232 raise 227 233 end 228 234 end … … 234 240 # 235 241 class DADLScanner < Base 236 attr_accessor :in_interval, :in_c_domain_type, : in_dblock242 attr_accessor :in_interval, :in_c_domain_type, :dblock_depth 237 243 @@logger = OpenEhr::ADL::Scanner::LOGGER #Logger.new('log/scanner.log') 238 244 RESERVED = { … … 242 248 } 243 249 244 def initialize( filename, lineno = 1)250 def initialize(adl_type, filename, lineno = 1) 245 251 super(adl_type, filename, lineno) 246 252 @in_interval = false 247 253 @in_c_domain_type = false 248 @in_dblock = true 249 @adl_type = nil 254 @dblock_depth = 0 250 255 end 251 256 … … 254 259 # 255 260 def scan(data) 261 @@logger.debug("Entering DADLScanner#scan at #{@filename}:#{@lineno}: @adl_type = #{@adl_type.inspect}, data = #{data.inspect}") 256 262 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 258 267 case data 259 268 when /\A\n/ # carriage return … … 287 296 yield :SYM_LT, :SYM_LT 288 297 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 291 303 yield :SYM_START_DBLOCK, :SYM_START_DBLOCK 292 304 end … … 294 306 if @in_interval 295 307 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 303 326 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, $& 305 330 end 306 elsif @in_c_domain_type == false307 adl_type = @adl_type.pop308 assert_at(__FILE__,__LINE__){adl_type == :dadl}309 yield :SYM_END_DBLOCK, $&310 else311 raise312 331 end 313 332 when /\A\-/ # - … … 389 408 end 390 409 data = $' # variable $' receives the string after the match 391 392 393 394 until data.nil? do395 case @adl_type.last396 when :dadl397 410 when :adl 398 411 adl_scanner = OpenEhr::ADL::Scanner::ADLScanner.new(@adl_type, @filename, @lineno) -
ruby/trunk/lib/adl_parser/test/parser_test.rb
r307 r314 183 183 184 184 # C_DV_QUANTITY parse error 185 #must "openEHR-EHR-CLUSTER.dimensions-circumference.v1.adl be properly parsed" do186 #file = File.read("#{TEST_ROOT_DIR}/adl/openEHR-EHR-CLUSTER.dimensions-circumference.v1.adl")187 #assert_nothing_raised do188 #ast = @parser.parse(file, 'openEHR-EHR-CLUSTER.dimensions-circumference.v1')189 #assert_instance_of OpenEhr::RM::Support::Identification::ArchetypeID, ast.archetype_id190 #end191 #end192 193 #must "openEHR-EHR-CLUSTER.dimensions.v1.adl be properly parsed" do194 #file = File.read("#{TEST_ROOT_DIR}/adl/openEHR-EHR-CLUSTER.dimensions.v1.adl")195 #assert_nothing_raised do196 #ast = @parser.parse(file, 'openEHR-EHR-CLUSTER.dimensions.v1')197 #assert_instance_of OpenEhr::RM::Support::Identification::ArchetypeID, ast.archetype_id198 #end199 #end200 201 #must "openEHR-EHR-CLUSTER.exam-fetus.v1.adl be properly parsed" do202 #file = File.read("#{TEST_ROOT_DIR}/adl/openEHR-EHR-CLUSTER.exam-fetus.v1.adl")203 #assert_nothing_raised do204 #ast = @parser.parse(file, 'openEHR-EHR-CLUSTER.exam-fetus.v1')205 #assert_instance_of OpenEhr::RM::Support::Identification::ArchetypeID, ast.archetype_id206 #end207 #end208 209 #must "openEHR-EHR-CLUSTER.exam-uterine_cervix.v1.adl be properly parsed" do210 #file = File.read("#{TEST_ROOT_DIR}/adl/openEHR-EHR-CLUSTER.exam-uterine_cervix.v1.adl")211 #assert_nothing_raised do212 #ast = @parser.parse(file, 'openEHR-EHR-CLUSTER.exam-uterine_cervix.v1')213 #assert_instance_of OpenEhr::RM::Support::Identification::ArchetypeID, ast.archetype_id214 #end215 #end216 217 #must "openEHR-EHR-EVALUATION.adverse.v1.adl be properly parsed" do218 #file = File.read("#{TEST_ROOT_DIR}/adl/openEHR-EHR-EVALUATION.adverse.v1.adl")219 #assert_nothing_raised do220 #ast = @parser.parse(file, 'openEHR-EHR-EVALUATION.adverse.v1')221 #assert_instance_of OpenEhr::RM::Support::Identification::ArchetypeID, ast.archetype_id222 #end223 #end224 #must "openEHR-EHR-OBSERVATION.body_mass_index.v1.adl be properly parsed" do225 #file = File.read("#{TEST_ROOT_DIR}/adl/openEHR-EHR-OBSERVATION.body_mass_index.v1.adl")226 #assert_nothing_raised do227 #ast = @parser.parse(file, 'openEHR-EHR-OBSERVATION.body_mass_index.v1')228 #assert_instance_of OpenEhr::RM::Support::Identification::ArchetypeID, ast.archetype_id229 #end230 #end185 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 231 231 232 232
Note:
See TracChangeset
for help on using the changeset viewer.