Changeset 314 for ruby/trunk/lib/adl_parser/lib/adl_scanner.rb
- Timestamp:
- Oct 12, 2009, 1:24:03 AM (15 years ago)
- File:
-
- 1 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)
Note:
See TracChangeset
for help on using the changeset viewer.