Changeset 283 for ruby/trunk/lib
- Timestamp:
- Sep 20, 2009, 1:20:48 PM (15 years ago)
- Location:
- ruby/trunk/lib/adl_parser
- Files:
-
- 1 added
- 1 deleted
- 9 edited
Legend:
- Unmodified
- Added
- Removed
-
ruby/trunk/lib/adl_parser/Rakefile
r261 r283 76 76 s.name = 'adl_parser' 77 77 s.author = 'Akimichi Tatsukawa' 78 s.version = '0.0. 3'78 s.version = '0.0.4' 79 79 s.summary = 'ADL parser' 80 80 s.email = 'akimichi.tatsukawa@gmail.com' … … 88 88 s.has_rdoc = true 89 89 s.extra_rdoc_files = ["README"] 90 s.add_dependency("yaparc", ">= 0.2.3")90 # s.add_dependency("yaparc", ">= 0.2.3") 91 91 s.add_dependency("openehr_models", ">= 0.0.3") 92 92 end -
ruby/trunk/lib/adl_parser/lib/adl_parser.rb
r261 r283 9 9 require 'logger' 10 10 require 'adl_scanner.rb' 11 require 'adl_exception.rb' 11 12 12 13 module OpenEHR -
ruby/trunk/lib/adl_parser/lib/adl_scanner.rb
r265 r283 5 5 require 'am.rb' 6 6 require 'rm.rb' 7 require 'util.rb' 7 8 8 9 … … 10 11 module ADL 11 12 module Scanner 13 LOGGER = Logger.new('log/scanner.log') 14 LOGGER.level = Logger::WARN 12 15 13 16 class Base 17 attr_accessor :adl_type, :lineno 14 18 def initialize(adl_type, filename, lineno = 1) 15 19 @adl_type = adl_type … … 23 27 end 24 28 25 class CADLScanner < Base 26 27 @@logger = Logger.new('log/scanner.log') 28 RESERVED = { 29 'then' => :SYM_THEN, # [Tt][Hh][Ee][Nn] 30 'else' => :SYM_ELSE, # [Ee][Ll][Ss][Ee] 31 'and' => :SYM_AND, # [Aa][Nn][Dd] 32 'or' => :SYM_OR, # [Oo][Rr] 33 'xor' => :SYM_XOR, # [Xx][Oo][Rr] 34 'not' => :SYM_NOT, # [Nn][Oo][Tt] 35 'implies' => :SYM_IMPLIES, # [Ii][Mm][Pp][Ll][Ii][Ee][Ss] 36 'true' => :SYM_TRUE, #[Tt][Rr][Uu][Ee] -- -> SYM_TRUE 37 'false' => :SYM_FALSE, # [Ff][Aa][Ll][Ss][Ee] -- -> SYM_FALSE 38 'forall' => :SYM_FORALL, # [Ff][Oo][Rr][_][Aa][Ll][Ll] 39 'exists' => :SYM_EXISTS, # [Ee][Xx][Ii][Ss][Tt][Ss] 40 'existence' => :SYM_EXISTENCE, # [Ee][Xx][Iu][Ss][Tt][Ee][Nn][Cc][Ee] 41 'occurrences' => :SYM_OCCURRENCES, # [Oo][Cc][Cc][Uu][Rr][Rr][Ee][Nn][Cc][Ee][Ss] 42 'cardinality' => :SYM_CARDINALITY, # [Cc][Aa][Rr][Dd][Ii][Nn][Aa][Ll][Ii][Tt][Yy] 43 'ordered' => :SYM_ORDERED, # [Oo][Rr][Dd][Ee][Rr][Ee][Dd] 44 'unordered' => :SYM_UNORDERED, # [Uu][Nn][Oo][Rr][Dd][Ee][Rr][Ee][Dd] 45 'unique' => :SYM_UNIQUE, # [Uu][Nn][Ii][Qq][Uu][Ee] 46 'matches' => :SYM_MATCHES, # [Mm][Aa][Tt][Cc][Hh][Ee][Ss] 47 'is_in' => :SYM_MATCHES, # [Ii][Ss][_][Ii][Nn] 48 'invariant' => :SYM_INVARIANT, # [Ii][Nn][Vv][Aa][Rr][Ii][Aa][Nn][Tt] 49 'infinity' => :SYM_INFINITY, # [Ii][Nn][Ff][Ii][Nn][Ii][Tt][Yy] -- -> SYM_INFINITY 50 'use_node' => :SYM_USE_NODE, # [Uu][Ss][Ee][_][Nn][Oo][Dd][Ee] 51 'use_archetype' => :SYM_ALLOW_ARCHETYPE, # [Uu][Ss][Ee][_][Aa][Rr][Cc][Hh][Ee][Tt][Yy][Pp][Ee] 52 'allow_archetype' => :SYM_ALLOW_ARCHETYPE, # [Aa][Ll][Ll][Oo][Ww][_][Aa][Rr][Cc][Hh][Ee][Tt][Yy][Pp][Ee] 53 'include' => :SYM_INCLUDE, # [Ii][Nn][Cc][Ll][Uu][Dd][Ee] 54 'exclude' => :SYM_EXCLUDE # [Ee][Xx][Cc][Ll][Uu][Dd][Ee] 55 } 56 57 def initialize(adl_type, filename, lineno = 1) 58 super(adl_type, filename, lineno) 59 @in_interval = false 60 @cadl_root_scanner = OpenEHR::ADL::Scanner::CADL::RootScanner.new 61 62 @adl_scanner = lambda{OpenEHR::ADL::Scanner::ADLScanner.new(adl_type, filename)} 63 @dadl_scanner = lambda{OpenEHR::ADL::Scanner::DADLScanner.new(adl_type, filename)} 64 @regex_scanner = lambda{OpenEHR::ADL::Scanner::RegexScanner.new(adl_type, filename)} 65 @term_constraint_scanner = lambda{OpenEHR::ADL::Scanner::TermConstraintScanner.new(adl_type, filename)} 66 end 67 68 def scan(data) 69 @@logger.debug("#{__FILE__}:#{__LINE__}: Entering scan_cadl at #{@filename}:#{@lineno}: data = #{data.inspect}") 70 until data.nil? do 71 case @adl_type.last 72 when :adl 73 data = @adl_scanner.call.scan(data) do |sym, val| 74 yield sym, val 75 end 76 when :dadl 77 data = @dadl_scanner.call.scan(data) do |sym, val| 78 yield sym, val 79 end 80 when :regexp 81 data = @regex_scanner.call..scan(data) do |sym, val| 82 yield sym, val 83 end 84 when :term_constraint 85 @@logger.debug("#{__FILE__}:#{__LINE__}: scan_cadl: Entering scan_term_constraint at #{@filename}:#{@lineno}: data = #{data.inspect}") 86 87 data = term_constraint_scanner.scan(data) do |sym, val| 88 yield sym, val 89 end 90 when :cadl 91 # case scanned = @cadl_root_scanner.parse(data) 92 # when Yaparc::Result::OK 93 # if scanned.value[0] == :START_V_C_DOMAIN_TYPE_BLOCK 94 # @in_c_domain_type = true 95 # @adl_type.push(:dadl) 96 # yield scanned.value 97 # else 98 # yield scanned.value 99 # end 100 # data = scanned.input 101 # end 102 103 case data 104 when /\A\n/ # carriage return 105 @lineno += 1 106 ; 107 when /\A[ \t\r\f]+/ #just drop it 108 ; 109 when /\A--.*\n/ # single line comment 110 @lineno += 1 111 @@logger.debug("#{__FILE__}:#{__LINE__}: scan_cadl: COMMENT = #{$&} at #{@filename}:#{@lineno}") 112 ; 113 ###----------/* symbols */ ------------------------------------------------- 114 when /\A\=/ # = 115 yield :SYM_EQ, :SYM_EQ 116 when /\A\>=/ # >= 117 yield :SYM_GE, :SYM_GE 118 when /\A\<=/ # <= 119 yield :SYM_LE, :SYM_LE 120 when /\A\</ # < 121 if @in_interval 122 yield :SYM_LT, :SYM_LT 123 else 124 @adl_type.push(:dadl) 125 yield :SYM_START_DBLOCK, $& 126 end 127 when /\A\>/ # > 128 if @in_interval 129 yield :SYM_GT, :SYM_GT 130 else 131 adl_type = @adl_type.pop 132 assert_at(__FILE__,__LINE__){adl_type == :dadl} 133 yield :SYM_END_DBLOCK, :SYM_END_DBLOCK 134 end 135 when /\A\-/ # - 136 yield :Minus_code, :Minus_code 137 when /\A\+/ # + 138 yield :Plus_code, :Plus_code 139 when /\A\*/ # * 140 yield :Star_code, :Star_code 141 when /\A\// # / 142 yield :Slash_code, :Slash_code 143 when /\A\^/ # ^ 144 yield :Caret_code, :Caret_code 145 when /\A\.\.\./ # ... 146 yield :SYM_LIST_CONTINUE, :SYM_LIST_CONTINUE 147 when /\A\.\./ # .. 148 yield :SYM_ELLIPSIS, :SYM_ELLIPSIS 149 when /\A\./ # . 150 yield :Dot_code, :Dot_code 151 when /\A\;/ # ; 152 yield :Semicolon_code, :Semicolon_code 153 when /\A\,/ # , 154 yield :Comma_code, :Comma_code 155 when /\A\:/ # : 156 yield :Colon_code, :Colon_code 157 when /\A\!/ # ! 158 yield :Exclamation_code, :Exclamation_code 159 when /\A\(/ # ( 160 yield :Left_parenthesis_code, :Left_parenthesis_code 161 when /\A\)/ # ) 162 yield :Right_parenthesis_code, :Right_parenthesis_code 163 when /\A\{\// #V_REGEXP 164 if @adl_type.last != :regexp 165 @in_regexp = true 166 @adl_type.push(:regexp) 167 yield :START_REGEXP_BLOCK, :START_REGEXP_BLOCK 168 else 169 raise 170 end 171 # yield :V_REGEXP, :V_REGEXP 172 when /\A\{/ # { 173 @adl_type.push(:cadl) 174 @@logger.debug("#{__FILE__}:#{__LINE__}: scan_cadl: entering cADL at #{@filename}:#{@lineno}") 175 yield :SYM_START_CBLOCK, :SYM_START_CBLOCK 176 when /\A\}/ # } 177 adl_type = @adl_type.pop 178 # puts "Escaping #{adl_type}" 179 assert_at(__FILE__,__LINE__){adl_type == :cadl} 180 @@logger.debug("#{__FILE__}:#{__LINE__}: scan_cadl: exiting cADL at #{@filename}:#{@lineno}") 181 yield :SYM_END_CBLOCK, :SYM_END_CBLOCK 182 when /\A\$/ # $ 183 yield :Dollar_code, :Dollar_code 184 when /\A\?\?/ # ?? 185 yield :SYM_DT_UNKNOWN, :SYM_DT_UNKNOWN 186 when /\A\?/ # ? 187 yield :Question_mark_code, :Question_mark_code 188 when /\A\|/ # | 189 @@logger.debug("#{__FILE__}:#{__LINE__}: scan_cadl: @in_interval = #{@in_interval} at #{@filename}:#{@lineno}") 190 if @in_interval 191 @in_interval = false 192 else 193 # @in_interval = false 194 @in_interval = true 195 end 196 @@logger.debug("#{__FILE__}:#{__LINE__}: scan_cadl: SYM_INTERVAL_DELIM at #{@filename}:#{@lineno}") 197 yield :SYM_INTERVAL_DELIM, :SYM_INTERVAL_DELIM 198 199 when /\A\[[a-zA-Z0-9()\._-]+::[a-zA-Z0-9\._-]+\]/ #V_QUALIFIED_TERM_CODE_REF form [ICD10AM(1998)::F23] 200 # when /\A\[[a-zA-Z0-9._\-]+::[a-zA-Z0-9._\-]+\]/ #V_QUALIFIED_TERM_CODE_REF form [ICD10AM(1998)::F23] 201 yield :V_QUALIFIED_TERM_CODE_REF, $& 202 when /\A\[[a-zA-Z0-9._\- ]+::[a-zA-Z0-9._\- ]+\]/ #ERR_V_QUALIFIED_TERM_CODE_REF 203 yield :ERR_V_QUALIFIED_TERM_CODE_REF, $& 204 when /\A\[([a-zA-Z0-9\(\)\._\-]+)::[ \t\n]*/ 205 @adl_type.push(:term_constraint) 206 yield :START_TERM_CODE_CONSTRAINT, $1 207 when /\A\[[a-zA-Z0-9][a-zA-Z0-9._\-]*\]/ #V_LOCAL_TERM_CODE_REF 208 yield :V_LOCAL_TERM_CODE_REF, $& 209 when /\A\[/ # [ 210 yield :Left_bracket_code, :Left_bracket_code 211 when /\A\]/ # ] 212 yield :Right_bracket_code, :Right_bracket_code 213 when /\A[A-Z][a-zA-Z0-9_]*<[a-zA-Z0-9,_<>]+>/ #V_GENERIC_TYPE_IDENTIFIER 214 yield :V_GENERIC_TYPE_IDENTIFIER, $& 215 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]/ 216 yield :V_ISO8601_DATE_TIME_CONSTRAINT_PATTERN, $& 217 when /\A[yY][yY][yY][yY]-[mM?X][mM?X]-[dD?X][dD?X]/ 218 yield :V_ISO8601_DATE_CONSTRAINT_PATTERN, $& 219 when /\A[hH][hH]:[mM?X][mM?X]:[sS?X][sS?X]/ 220 yield :V_ISO8601_TIME_CONSTRAINT_PATTERN, $& 221 when /\A[a-z][a-zA-Z0-9_]*/ 222 word = $&.dup 223 if RESERVED[word.downcase] 224 yield RESERVED[word.downcase], RESERVED[word.downcase] 225 else 226 @@logger.debug("#{__FILE__}:#{__LINE__}: scan_cadl: V_ATTRIBUTE_IDENTIFIER = #{word} at #{@filename}:#{@lineno}") 227 yield :V_ATTRIBUTE_IDENTIFIER, word #V_ATTRIBUTE_IDENTIFIER /\A[a-z][a-zA-Z0-9_]*/ 228 end 229 when /\A[A-Z][a-zA-Z0-9_]*/ 230 word = $&.dup 231 if RESERVED[word.downcase] 232 yield RESERVED[word.downcase], RESERVED[word.downcase] 233 else 234 yield :V_TYPE_IDENTIFIER, $& 235 end 236 when /\Aa[ct][0-9.]+/ #V_LOCAL_CODE 237 yield :V_LOCAL_CODE, $& 238 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-]- 239 yield :V_ISO8601_EXTENDED_DATE_TIME, $& 240 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] 241 yield :V_ISO8601_EXTENDED_TIME, $& 242 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 243 yield :V_ISO8601_EXTENDED_DATE, $& 244 when /\A[0-9]+|[0-9]+[eE][+-]?[0-9]+/ #V_INTEGER 245 yield :V_INTEGER, $& 246 when /\A[0-9]+\.[0-9]+|[0-9]+\.[0-9]+[eE][+-]?[0-9]+ / #V_REAL 247 yield :V_REAL, $& 248 when /\A"((?:[^"\\]+|\\.)*)"/ #V_STRING 249 when /\A"([^"]*)"/m #V_STRING 250 yield :V_STRING, $1 251 when /\A[a-z]+:\/\/[^<>|\\{}^~"\[\] ]*/ #V_URI 252 yield :V_URI, $& 253 when /\A\S/ #UTF8CHAR 254 yield :UTF8CHAR, $& 255 else 256 raise 257 end 258 data = $' # variable $' receives the string after the match 259 else 260 raise 261 end 262 end # of until 263 end 264 end # of 265 266 class DADLScanner < Base 267 @@logger = Logger.new('log/scanner.log') 268 RESERVED = { 269 'true' => :SYM_TRUE, #[Tt][Rr][Uu][Ee] -- -> SYM_TRUE 270 'false' => :SYM_FALSE, # [Ff][Aa][Ll][Ss][Ee] -- -> SYM_FALSE 271 'infinity' => :SYM_INFINITY # [Ii][Nn][Ff][Ii][Nn][Ii][Tt][Yy] -- -> SYM_INFINITY 272 } 273 274 def initialize(adl_type, filename, lineno = 1) 275 super(adl_type, filename, lineno) 276 @dadl_root_scanner = OpenEHR::ADL::Scanner::DADL::RootScanner.new 277 @in_c_domain_type = false 278 279 @adl_scanner = lambda{OpenEHR::ADL::Scanner::ADLScanner.new(adl_type, filename)} 280 @cadl_scanner = lambda{OpenEHR::ADL::Scanner::CADLScanner.new(adl_type, filename)} 281 @regex_scanner = lambda{OpenEHR::ADL::Scanner::RegexScanner.new(adl_type, filename)} 282 @term_constraint_scanner = lambda{OpenEHR::ADL::Scanner::TermConstraintScanner.new(adl_type, filename)} 283 end 284 285 286 def scan(data) 287 @@logger.debug("#{__FILE__}:#{__LINE__}: Entering scan_dadl at #{@filename}:#{@lineno}: data = #{data.inspect}") 288 until data.nil? do 289 case @adl_type.last 290 when :adl 291 data = @adl_scanner.call.scan(data) do |sym, val| 292 yield sym, val 293 end 294 when :cadl 295 data = @cadl_scanner.call.scan(data) do |sym, val| 296 yield sym, val 297 end 298 when :regexp 299 data = @regex_scanner.call.scan(data) do |sym, val| 300 yield sym, val 301 end 302 when :term_constraint 303 @@logger.debug("#{__FILE__}:#{__LINE__}: scan_dadl: Entering scan_term_constraint at #{@filename}:#{@lineno}: data = #{data.inspect}") 304 305 data = @term_constraint_scanner.call.scan(data) do |sym, val| 306 yield sym, val 307 end 308 when :dadl 309 # case scanned = @dadl_root_scanner.parse(data) 310 # when Yaparc::Result::OK 311 # yield scanned.value 312 # data = scanned.input 313 # else 314 # end 315 316 case data 317 when /\A\n/ # carriage return 318 @lineno += 1 319 ; 320 when /\A[ \t\r\f]+/ #just drop it 321 ; 322 when /\A--.*\n/ # single line comment 323 @lineno += 1 324 @@logger.debug("#{__FILE__}:#{__LINE__}: scan_dadl: COMMENT = #{$&} at #{@filename}:#{@lineno}") 325 ; 326 ###----------/* symbols */ ------------------------------------------------- 327 when /\A\=/ # = 328 yield :SYM_EQ, :SYM_EQ 329 when /\A\>\=/ # >= 330 yield :SYM_GE, :SYM_GE 331 when /\A\<\=/ # <= 332 yield :SYM_LE, :SYM_LE 333 when /\A\</ # < 334 if @in_interval 335 yield :SYM_LT, :SYM_LT 336 else 337 @adl_type.push(:dadl) 338 yield :SYM_START_DBLOCK, :SYM_START_DBLOCK 339 end 340 when /\A\>/ # > 341 if @in_interval 342 yield :SYM_GT, :SYM_GT 343 elsif @in_c_domain_type == true 344 assert_at(__FILE__,__LINE__){@adl_type.last == :dadl} 345 adl_type = @adl_type.pop 346 if @adl_type.last == :cadl 347 @in_c_domain_type = false 348 yield :END_V_C_DOMAIN_TYPE_BLOCK, $& 349 else 350 yield :SYM_END_DBLOCK, $& 351 end 352 elsif @in_c_domain_type == false 353 adl_type = @adl_type.pop 354 assert_at(__FILE__,__LINE__){adl_type == :dadl} 355 yield :SYM_END_DBLOCK, $& 356 else 357 raise 358 end 359 when /\A\-/ # - 360 yield :Minus_code, :Minus_code 361 when /\A\+/ # + 362 yield :Plus_code, :Plus_code 363 when /\A\*/ # * 364 yield :Star_code, :Star_code 365 when /\A\// # / 366 yield :Slash_code, :Slash_code 367 when /\A\^/ # ^ 368 yield :Caret_code, :Caret_code 369 when /\A\.\.\./ # ... 370 yield :SYM_LIST_CONTINUE, :SYM_LIST_CONTINUE 371 when /\A\.\./ # .. 372 yield :SYM_ELLIPSIS, :SYM_ELLIPSIS 373 when /\A\./ # . 374 yield :Dot_code, :Dot_code 375 when /\A\;/ # ; 376 yield :Semicolon_code, :Semicolon_code 377 when /\A\,/ # , 378 yield :Comma_code, :Comma_code 379 when /\A\:/ # : 380 yield :Colon_code, :Colon_code 381 when /\A\!/ # ! 382 yield :Exclamation_code, :Exclamation_code 383 when /\A\(/ # ( 384 yield :Left_parenthesis_code, :Left_parenthesis_code 385 when /\A\)/ # ) 386 yield :Right_parenthesis_code, :Right_parenthesis_code 387 when /\A\$/ # $ 388 yield :Dollar_code, :Dollar_code 389 when /\A\?\?/ # ?? 390 yield :SYM_DT_UNKNOWN, :SYM_DT_UNKNOWN 391 when /\A\?/ # ? 392 yield :Question_mark_code, :Question_mark_code 393 when /\A\|/ # | 394 @@logger.debug("#{__FILE__}:#{__LINE__}: scan_dadl: @in_interval = #{@in_interval} at #{@filename}:#{@lineno}") 395 if @in_interval 396 @in_interval = false 397 else 398 # @in_interval = false 399 @in_interval = true 400 end 401 @@logger.debug("#{__FILE__}:#{__LINE__}: scan_dadl: SYM_INTERVAL_DELIM at #{@filename}:#{@lineno}") 402 yield :SYM_INTERVAL_DELIM, :SYM_INTERVAL_DELIM 403 when /\A\[/ # [ 404 yield :Left_bracket_code, :Left_bracket_code 405 when /\A\]/ # ] 406 yield :Right_bracket_code, :Right_bracket_code 407 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-]- 408 yield :V_ISO8601_EXTENDED_DATE_TIME, $& 409 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] 410 yield :V_ISO8601_EXTENDED_TIME, $& 411 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 412 yield :V_ISO8601_EXTENDED_DATE, $& 413 when /\A[A-Z][a-zA-Z0-9_]*<[a-zA-Z0-9,_<>]+>/ #V_GENERIC_TYPE_IDENTIFIER 414 yield :V_GENERIC_TYPE_IDENTIFIER, $& 415 when /\A[0-9]+|[0-9]+[eE][+-]?[0-9]+/ #V_INTEGER 416 yield :V_INTEGER, $& 417 when /\A[a-z]+:\/\/[^<>|\\{}^~"\[\] ]*/ #V_URI 418 yield :V_URI, $& 419 when /\A\S/ #UTF8CHAR 420 yield :UTF8CHAR, $& 421 end 422 data = $' # variable $' receives the string after the match 423 else 424 raise 425 end 426 end 427 end 428 end 429 430 class RegexScanner < Base 431 def initialize(adl_type, filename, lineno = 1) 432 super(adl_type, filename, lineno) 433 @adl_scanner = lambda{OpenEHR::ADL::Scanner::ADLScanner.new(adl_type, filename)} 434 @cadl_scanner = lambda{OpenEHR::ADL::Scanner::CADLScanner.new(adl_type, filename)} 435 @dadl_scanner = lambda{OpenEHR::ADL::Scanner::DADLScanner.new(adl_type, filename)} 436 @term_constraint_scanner = lambda{OpenEHR::ADL::Scanner::TermConstraintScanner.new(adl_type, filename)} 437 end 438 439 def scan(data) 440 @@logger.debug("#{__FILE__}:#{__LINE__}: Entering scan_regexp at #{@filename}:#{@lineno}: data = #{data.inspect}") 441 until data.nil? do 442 case @adl_type.last 443 when :regexp 444 case data 445 when /\A\/\}/ #V_REGEXP 446 if @adl_type.last == :regexp 447 @in_regexp = false 448 @adl_type.pop 449 yield :END_REGEXP_BLOCK, :END_REGEXP_BLOCK 450 else 451 raise 452 end 453 when /\A(.*)(\/\})/ #V_REGEXP 454 yield :REGEXP_BODY, $1 455 if @adl_type.last == :regexp 456 @in_regexp = false 457 @adl_type.pop 458 yield :END_REGEXP_BLOCK, :END_REGEXP_BLOCK 459 else 460 raise 461 end 462 else 463 raise data 464 end 465 data = $' # variable $' receives the string after the match 466 when :adl 467 data = @adl_scanner.call.scan(data) do |sym, val| 468 yield sym, val 469 end 470 when :dadl 471 data = @dadl_scanner.scan(data) do |sym, val| 472 yield sym, val 473 end 474 when :cadl 475 data = @cadl_scanner.scan(data) do |sym, val| 476 yield sym, val 477 end 478 when :term_constraint 479 @@logger.debug("#{__FILE__}:#{__LINE__}: scan_regexp: Entering scan_term_constraint at #{@filename}:#{@lineno}") 480 data = @term_constraint_scanner.scan(data) do |sym, val| 481 yield sym, val 482 end 483 else 484 raise 485 end 486 end 487 end 488 end 489 490 class TermConstraintScanner < Base 491 def initialize(adl_type, filename, lineno = 1) 492 super(adl_type, filename, lineno) 493 @adl_scanner = lambda{OpenEHR::ADL::Scanner::ADLScanner.new(adl_type, filename)} 494 @cadl_scanner = lambda{OpenEHR::ADL::Scanner::CADLScanner.new(adl_type, filename)} 495 @dadl_scanner = lambda{OpenEHR::ADL::Scanner::DADLScanner.new(adl_type, filename)} 496 @regex_scanner = lambda{OpenEHR::ADL::Scanner::RegexScanner.new(adl_type, filename)} 497 end 498 499 def scan(data) 500 @@logger.debug("#{__FILE__}:#{__LINE__}: Entering scan_term_constraint") 501 until data.nil? do 502 case @adl_type.last 503 when :term_constraint 504 case data 505 when /\A\n/ # carriage return 506 @lineno += 1 507 ; 508 when /\A[ \t\r\f]+/ #just drop it 509 ; 510 when /\A--.*$/ # single line comment 511 @lineno += 1 512 #@@logger.debug("#{__FILE__}:#{__LINE__}: scan_term_constraint: COMMENT = #{$&} at #{@filename}:#{@lineno}") 513 ; 514 when /\A([a-zA-Z0-9\._\-])+[ \t]*,/ # match any line, with ',' termination 515 yield :TERM_CODE, $1 516 when /\A([a-zA-Z0-9\._\-])+[ \t]*;/ # match second last line with ';' termination (assumed value) 517 yield :TERM_CODE, $1 518 when /\A([a-zA-Z0-9\._\-])*[ \t]*\]/ # match final line, terminating in ']' 519 adl_type = @adl_type.pop 520 assert_at(__FILE__,__LINE__){adl_type == :term_constraint} 521 yield :END_TERM_CODE_CONSTRAINT, $1 522 else 523 raise "data = #{data}" 524 end 525 data = $' # variable $' receives the string after the match 526 when :adl 527 data = @adl_scanner.call.scan(data) do |sym, val| 528 yield sym, val 529 end 530 when :dadl 531 data = @dadl_scanner.call.scan(data) do |sym, val| 532 yield sym, val 533 end 534 when :cadl 535 data = @cadl_scanner.call.scan(data) do |sym, val| 536 yield sym, val 537 end 538 else 539 raise 540 end 541 end 542 end 543 end 544 29 # 30 # ADLScanner 31 # 545 32 class ADLScanner < Base 546 33 attr_accessor :adl_type, :lineno, :cadl_scanner, :dadl_scanner, :regex_scanner, :term_constraint_scanner 547 34 548 @@logger = Logger.new('log/scanner.log')35 @@logger = OpenEHR::ADL::Scanner::LOGGER #Logger.new('log/scanner.log') 549 36 RESERVED = { 550 37 'archetype' => :SYM_ARCHETYPE, … … 568 55 def initialize(adl_type, filename, lineno = 1) 569 56 super(adl_type, filename, lineno) 570 @cadl_scanner = lambda{OpenEHR::ADL::Scanner::CADLScanner.new(adl_type, filename)} 571 @dadl_scanner = lambda{OpenEHR::ADL::Scanner::DADLScanner.new(adl_type, filename)} 572 @regex_scanner = lambda{OpenEHR::ADL::Scanner::RegexScanner.new(adl_type, filename)} 573 @term_constraint_scanner = lambda{OpenEHR::ADL::Scanner::TermConstraintScanner.new(adl_type, filename)} 57 @in_interval = false 574 58 end 575 59 60 # 61 # ADLScanner#scan 62 # 576 63 def scan(data) 577 @@logger.debug("#{__FILE__}:#{__LINE__}: Entering scan_adlat #{@filename}:#{@lineno}: data = #{data.inspect}")64 @@logger.debug("#{__FILE__}:#{__LINE__}: Entering ADLScanner#scan at #{@filename}:#{@lineno}: data = #{data.inspect}") 578 65 until data.nil? do 579 66 case @adl_type.last 580 when :dadl581 data = @dadl_scanner.call.scan(data) do |sym, val|582 yield sym, val583 end584 when :cadl585 data = @cadl_scanner.call.scan(data) do |sym, val|586 yield sym, val587 end588 when :regexp589 data = @regex_scanner.call.scan(data) do |sym, val|590 yield sym, val591 end592 when :term_constraint593 @@logger.debug("#{__FILE__}:#{__LINE__}: scan_adl: Entering scan_term_constraint at #{@filename}:#{@lineno}: data = #{data.inspect}")594 595 data = @term_constraint_scanner.call.scan(data) do |sym, val|596 yield sym, val597 end598 67 when :adl 599 68 case data … … 603 72 when /\A[ \t\r\f]+/ #just drop it 604 73 ; 605 when /\A--.* \n/ # single line comment74 when /\A--.*/ # single line comment 606 75 @lineno += 1 607 @@logger.debug(" #{__FILE__}:#{__LINE__}: scan_adl: COMMENT = #{$&} at #{@filename}:#{@lineno}")76 @@logger.debug("ADLScanner#scan: COMMENT = #{$&} at #{@filename}:#{@lineno}") 608 77 ; 609 78 when /\Adescription/ # description … … 611 80 when /\Adefinition/ # definition 612 81 yield :SYM_DEFINITION, :SYM_DEFINITION 613 82 ###----------/* symbols */ ------------------------------------------------- 614 83 when /\A[A-Z][a-zA-Z0-9_]*/ 615 84 yield :V_TYPE_IDENTIFIER, $& 616 # when /\A[a-zA-Z][a-zA-Z0-9_-]+\.[a-zA-Z][a-zA-Z0-9_-]+\.[a-zA-Z0-9]+/ #V_ARCHETYPE_ID 617 when /\A(\w+)-(\w+)-(\w+)\.(\w+)(-\w+)?\.(v\w+)/ #V_ARCHETYPE_ID 85 when /\A(\w+)-(\w+)-(\w+)\.(\w+)((?:-\w+)*)\.(v\w+)/ #V_ARCHETYPE_ID 618 86 object_id, rm_originator, rm_name, rm_entity, concept_name, specialisation, version_id = $&, $1, $2, $3, $4, $5, $6 619 87 archetype_id = OpenEHR::RM::Support::Identification::Archetype_ID.new(object_id, concept_name, rm_name, rm_entity, rm_originator, specialisation, version_id) 620 # yield :V_ARCHETYPE_ID, $&621 88 yield :V_ARCHETYPE_ID, archetype_id 622 89 when /\A[a-z][a-zA-Z0-9_]*/ 623 # word = $&.downcase624 90 word = $& 625 91 if RESERVED[word] 626 @@logger.debug(" #{__FILE__}:#{__LINE__}: scan_adl: RESERVED = #{RESERVED[word]} at #{@filename}:#{@lineno}")92 @@logger.debug("ADLScanner#scan: RESERVED = #{RESERVED[word]} at #{@filename}:#{@lineno}") 627 93 yield RESERVED[word], RESERVED[word] 628 94 elsif #/\A[A-Z][a-zA-Z0-9_]*/ 629 @@logger.debug(" #{__FILE__}:#{__LINE__}: scan_adl: V_ATTRIBUTE_IDENTIFIER = #{$&} at #{@filename}:#{@lineno}")95 @@logger.debug("ADLScanner#scan: V_ATTRIBUTE_IDENTIFIER = #{$&} at #{@filename}:#{@lineno}") 630 96 yield :V_ATTRIBUTE_IDENTIFIER, $& 631 97 end … … 637 103 yield :SYM_LE, :SYM_LE 638 104 when /\A\</ # < 639 if @in_interval # @start_block_received = false105 if @in_interval 640 106 yield :SYM_LT, :SYM_LT 641 else # @start_block_received = true107 else 642 108 @adl_type.push(:dadl) 643 109 yield :SYM_START_DBLOCK, $& … … 653 119 when /\A\{/ # { 654 120 @adl_type.push(:cadl) 655 @@logger.debug(" #{__FILE__}:#{__LINE__}: scan_cadl: entering cADL at #{@filename}:#{@lineno}")121 @@logger.debug("ADLScanner#scan: SYM_START_CBLOCK") 656 122 yield :SYM_START_CBLOCK, :SYM_START_CBLOCK 657 123 when /\A\}/ # } 658 124 adl_type = @adl_type.pop 659 125 assert_at(__FILE__,__LINE__){adl_type == :cadl} 660 @@logger.debug(" #{__FILE__}:#{__LINE__}: scan_cadl: exiting cADL at #{@filename}:#{@lineno}")126 @@logger.debug("ADLScanner#scan: SYM_END_CBLOCK") 661 127 yield :SYM_END_CBLOCK, $& 662 128 when /\A\-/ # - … … 705 171 end 706 172 yield :SYM_INTERVAL_DELIM, :SYM_INTERVAL_DELIM 707 when /\A\[[a-zA-Z0-9()\._-]+::[a-zA-Z0-9\._-]+\]/ 708 # when /\A\[[a-zA-Z0-9()\._-]+\:\:[a-zA-Z0-9\._-]+\]/ #V_QUALIFIED_TERM_CODE_REF form [ICD10AM(1998)::F23] 709 yield :V_QUALIFIED_TERM_CODE_REF, $& 173 when /\A\[([a-zA-Z0-9()\._-]+::[a-zA-Z0-9\._-]+)\]/ #V_QUALIFIED_TERM_CODE_REF form such as [ICD10AM(1998)::F23] 174 yield :V_QUALIFIED_TERM_CODE_REF, $1 710 175 when /\A\[[a-zA-Z0-9][a-zA-Z0-9._\-]*\]/ #V_LOCAL_TERM_CODE_REF 711 176 yield :V_LOCAL_TERM_CODE_REF, $& … … 714 179 when /\A\]/ # ] 715 180 yield :Right_bracket_code, :Right_bracket_code 716 717 181 when /\A"([^"]*)"/m #V_STRING 718 182 yield :V_STRING, $1 … … 730 194 yield :V_GENERIC_TYPE_IDENTIFIER, $& 731 195 when /\A[0-9]+|[0-9]+[eE][+-]?[0-9]+/ #V_INTEGER 196 @@logger.debug("ADLScanner#scan: V_INTEGER = #{$&}") 732 197 yield :V_INTEGER, $& 733 198 when /\A[0-9]+\.[0-9]+|[0-9]+\.[0-9]+[eE][+-]?[0-9]+ / #V_REAL … … 742 207 end 743 208 data = $' # variable $' receives the string after the match 209 when :dadl 210 dadl_scanner = OpenEHR::ADL::Scanner::DADLScanner.new(@adl_type, @filename, @lineno) 211 data = dadl_scanner.scan(data) do |sym, val| 212 yield sym, val 213 end 214 when :cadl 215 cadl_scanner = OpenEHR::ADL::Scanner::CADLScanner.new(@adl_type, @filename, @lineno) 216 data = cadl_scanner.scan(data) do |sym, val| 217 yield sym, val 218 end 219 when :regexp 220 regex_scanner = OpenEHR::ADL::Scanner::RegexScanner.new(@adl_type, @filename, @lineno) 221 data = regex_scanner.scan(data) do |sym, val| 222 yield sym, val 223 end 224 when :term_constraint 225 term_constraint_scanner = OpenEHR::ADL::Scanner::TermConstraintScanner.new(@adl_type, @filename, @lineno) 226 data = term_constraint_scanner.scan(data) do |sym, val| 227 yield sym, val 228 end 744 229 else 745 230 raise … … 747 232 end 748 233 end 749 end 750 751 752 module Common 753 class START_TERM_CODE_CONSTRAINT 754 include Yaparc::Parsable 755 def initialize 756 @parser = lambda do |input| 757 Yaparc::Apply.new(Yaparc::Regex.new(/[ \t\n]*\[([a-zA-Z0-9\(\)\._\-]+)::[ \t\n]*/)) do |match| 758 OpenEHR::LOG.info("START_TERM_CODE_CONSTRAINT: #{match}") 759 [:START_TERM_CODE_CONSTRAINT, match] 760 end 761 end 762 end 763 end 764 765 # /\A\[[a-zA-Z0-9()\._-]+::[a-zA-Z0-9\._-]+\]/ #V_QUALIFIED_TERM_CODE_REF form [ICD10AM(1998)::F23] 766 class V_QUALIFIED_TERM_CODE_REF 767 include Yaparc::Parsable 768 def initialize 769 @parser = lambda do |input| 770 Yaparc::Apply.new(Yaparc::Regex.new(/\A\[[a-zA-Z0-9()\._-]+::[a-zA-Z0-9\._-]+\]/)) do |match| 771 OpenEHR::LOG.info("V_QUALIFIED_TERM_CODE_REF: #{match}") 772 [:V_QUALIFIED_TERM_CODE_REF, match] 773 end 774 end 775 end 776 end 777 778 class V_LOCAL_TERM_CODE_REF 779 include Yaparc::Parsable 780 def initialize 781 @parser = lambda do |input| 782 Yaparc::Apply.new(Yaparc::Regex.new(/\A\[[a-zA-Z0-9][a-zA-Z0-9._\-]*\]/)) do |match| 783 OpenEHR::LOG.info("V_TERM_CODE_REF: #{match}") 784 [:V_LOCAL_TERM_CODE_REF, match] 785 end 786 end 787 end 788 end 789 790 class ERR_V_QUALIFIED_TERM_CODE_REF 791 include Yaparc::Parsable 792 def initialize 793 @parser = lambda do |input| 794 Yaparc::Apply.new(Yaparc::Regex.new(/\A\[[a-zA-Z0-9._\- ]+::[a-zA-Z0-9._\- ]+\]/)) do |match| 795 OpenEHR::LOG.info("ERR_V_QUALIFIED_TERM_CODE_REF: #{match}") 796 [:ERR_V_QUALIFIED_TERM_CODE_REF, match] 797 end 798 end 799 end 800 end 801 802 class V_TYPE_IDENTIFIER 803 include Yaparc::Parsable 804 def initialize 805 @parser = lambda do |input| 806 Yaparc::Apply.new(Yaparc::Regex.new(/\A[A-Z][a-zA-Z0-9_]*/)) do |match| 807 OpenEHR::LOG.info("V_TYPE_IDENTIFIER: #{match}") 808 [:V_TYPE_IDENTIFIER, match] 809 end 810 end 811 end 812 end 813 814 class V_GENERIC_TYPE_IDENTIFIER 815 include Yaparc::Parsable 816 def initialize 817 @parser = lambda do |input| 818 Yaparc::Apply.new(Yaparc::Regex.new(/\A[A-Z][a-zA-Z0-9_]*<[a-zA-Z0-9,_<>]+>/)) do |match| 819 OpenEHR::LOG.info("V_GENERIC_TYPE_IDENTIFIER: #{match}") 820 [:V_GENERIC_TYPE_IDENTIFIER, match] 821 end 822 end 823 end 824 end 825 826 827 class V_LOCAL_CODE 828 include Yaparc::Parsable 829 def initialize 830 @parser = lambda do |input| 831 Yaparc::Apply.new(Yaparc::Regex.new(/\Aa[ct][0-9.]+/)) do |match| 832 OpenEHR::LOG.info("V_LOCAL_CODE: #{match}") 833 [:V_LOCAL_CODE, match] 834 end 835 end 836 end 837 end 838 839 class V_STRING 840 include Yaparc::Parsable 841 def initialize 842 @parser = lambda do |input| 843 Yaparc::Apply.new(Yaparc::Regex.new(/\A"([^"]*)"/m)) do |match| 844 OpenEHR::LOG.info("V_STRING: #{match}") 845 [:V_STRING, match] 846 end 847 end 848 end 849 end 850 851 class V_REAL 852 include Yaparc::Parsable 853 def initialize 854 @parser = lambda do |input| 855 Yaparc::Apply.new(Yaparc::Regex.new(/\A[0-9]+\.[0-9]+|[0-9]+\.[0-9]+[eE][+-]?[0-9]+/)) do |match| 856 OpenEHR::LOG.info("V_REAL: #{match}") 857 [:V_REAL, match] 858 end 859 end 860 end 861 end 862 863 #V_ISO8601_DURATION PnYnMnWnDTnnHnnMnnS 864 class V_ISO8601_DURATION 865 include Yaparc::Parsable 866 def initialize 867 @parser = lambda do |input| 868 Yaparc::Apply.new( 869 Yaparc::Alt.new(Yaparc::Regex.new(/\AP([0-9]+|[yY])?([0-9]+|[mM])?([0-9]+|[wW])?([0-9]+|[dD])?T([0-9]+|[hH])?([0-9]+|[mM])?([0-9]+|[sS])?/), 870 Yaparc::Regex.new(/\AP([0-9]+|[yY])?([0-9]+|[mM])?([0-9]+|[wW])?([0-9]+|[dD])?/))) do |match| 871 OpenEHR::LOG.info("V_ISO8601_DURATION: #{match}") 872 [:V_ISO8601_DURATION, match] 873 end 874 end 875 end 876 end 877 878 end # of Common 879 880 module DADL 881 # c.f. http://www.openehr.org/svn/ref_impl_eiffel/TRUNK/components/adl_parser/src/syntax/adl/parser/adl_scanner.l 234 end # of ADLScanner 235 236 # 237 # DADLScanner 238 # 239 class DADLScanner < Base 240 @@logger = OpenEHR::ADL::Scanner::LOGGER #Logger.new('log/scanner.log') 882 241 RESERVED = { 883 242 'true' => :SYM_TRUE, #[Tt][Rr][Uu][Ee] -- -> SYM_TRUE … … 885 244 'infinity' => :SYM_INFINITY # [Ii][Nn][Ff][Ii][Nn][Ii][Tt][Yy] -- -> SYM_INFINITY 886 245 } 246 247 def initialize(adl_type, filename, lineno = 1) 248 super(adl_type, filename, lineno) 249 @in_interval = false 250 @in_c_domain_type = false 251 end 252 887 253 # 888 # DADL ::RootScanner254 # DADLScanner#scan 889 255 # 890 class RootScanner 891 include Yaparc::Parsable 892 def initialize 893 @parser = lambda do |input| 894 Yaparc::Alt.new(Reserved.new, 895 OpenEHR::ADL::Scanner::Common::V_QUALIFIED_TERM_CODE_REF.new, 896 OpenEHR::ADL::Scanner::Common::V_LOCAL_TERM_CODE_REF.new, 897 OpenEHR::ADL::Scanner::Common::ERR_V_QUALIFIED_TERM_CODE_REF.new, 898 OpenEHR::ADL::Scanner::Common::V_TYPE_IDENTIFIER.new, 899 OpenEHR::ADL::Scanner::Common::V_GENERIC_TYPE_IDENTIFIER.new, 900 OpenEHR::ADL::Scanner::Common::V_STRING.new, 901 OpenEHR::ADL::Scanner::Common::V_LOCAL_CODE.new, 902 OpenEHR::ADL::Scanner::Common::V_REAL.new, 903 OpenEHR::ADL::Scanner::Common::V_ISO8601_DURATION.new#, 904 #OpenEHR::ADL::Scanner::Common::START_TERM_CODE_CONSTRAINT.new 905 ) 256 def scan(data) 257 @@logger.debug("Entering DADLScanner#scan at #{@filename}:#{@lineno}: @adl_type = #{@adl_type.inspect}, data = #{data.inspect}") 258 until data.nil? do 259 @@logger.debug("#{@filename}:#{@lineno}: DADLScanner#scan:loop data = #{data.inspect}") 260 case @adl_type.last 261 when :dadl 262 case data 263 when /\A\n/ # carriage return 264 #@@logger.debug("DADLScanner#scan: carriage return, data = #{data.inspect}") 265 @lineno += 1 266 ; 267 when /\A[ \t\r\f]+/ #just drop it 268 #@@logger.debug("DADLScanner#scan: white space, data = #{data.inspect}") 269 ; 270 when /\A--.*/ # single line comment 271 # @lineno += 1 272 @@logger.debug("DADLScanner#scan: COMMENT = #{$&} at #{@filename}:#{@lineno}") 273 ; 274 when /\A[a-z][a-zA-Z0-9_]*/ 275 word = $&.dup 276 if RESERVED[word.downcase] 277 yield RESERVED[word.downcase], RESERVED[word.downcase] 278 else 279 @@logger.debug("DADLScanner#scan: V_ATTRIBUTE_IDENTIFIER = #{word} at #{@filename}:#{@lineno}") 280 yield :V_ATTRIBUTE_IDENTIFIER, word #V_ATTRIBUTE_IDENTIFIER /\A[a-z][a-zA-Z0-9_]*/ 281 end 282 ###----------/* symbols */ ------------------------------------------------- 283 when /\A\=/ # = 284 yield :SYM_EQ, :SYM_EQ 285 when /\A\>\=/ # >= 286 yield :SYM_GE, :SYM_GE 287 when /\A\<\=/ # <= 288 yield :SYM_LE, :SYM_LE 289 when /\A\</ # < 290 if @in_interval 291 yield :SYM_LT, :SYM_LT 292 else 293 @adl_type.push(:dadl) 294 yield :SYM_START_DBLOCK, :SYM_START_DBLOCK 295 end 296 when /\A\>/ # > 297 if @in_interval 298 yield :SYM_GT, :SYM_GT 299 elsif @in_c_domain_type == true 300 assert_at(__FILE__,__LINE__){@adl_type.last == :dadl} 301 adl_type = @adl_type.pop 302 if @adl_type.last == :cadl 303 @in_c_domain_type = false 304 yield :END_V_C_DOMAIN_TYPE_BLOCK, $& 305 else 306 yield :SYM_END_DBLOCK, $& 307 end 308 elsif @in_c_domain_type == false 309 adl_type = @adl_type.pop 310 assert_at(__FILE__,__LINE__){adl_type == :dadl} 311 yield :SYM_END_DBLOCK, $& 312 else 313 raise 314 end 315 when /\A\-/ # - 316 yield :Minus_code, :Minus_code 317 when /\A\+/ # + 318 yield :Plus_code, :Plus_code 319 when /\A\*/ # * 320 yield :Star_code, :Star_code 321 when /\A\// # / 322 yield :Slash_code, :Slash_code 323 when /\A\^/ # ^ 324 yield :Caret_code, :Caret_code 325 when /\A\.\.\./ # ... 326 yield :SYM_LIST_CONTINUE, :SYM_LIST_CONTINUE 327 when /\A\.\./ # .. 328 yield :SYM_ELLIPSIS, :SYM_ELLIPSIS 329 when /\A\./ # . 330 yield :Dot_code, :Dot_code 331 when /\A\;/ # ; 332 yield :Semicolon_code, :Semicolon_code 333 when /\A\,/ # , 334 yield :Comma_code, :Comma_code 335 when /\A\:/ # : 336 yield :Colon_code, :Colon_code 337 when /\A\!/ # ! 338 yield :Exclamation_code, :Exclamation_code 339 when /\A\(/ # ( 340 yield :Left_parenthesis_code, :Left_parenthesis_code 341 when /\A\)/ # ) 342 yield :Right_parenthesis_code, :Right_parenthesis_code 343 when /\A\$/ # $ 344 yield :Dollar_code, :Dollar_code 345 when /\A\?\?/ # ?? 346 yield :SYM_DT_UNKNOWN, :SYM_DT_UNKNOWN 347 when /\A\?/ # ? 348 yield :Question_mark_code, :Question_mark_code 349 when /\A\|/ # | 350 @@logger.debug("DADLScanner#scan: @in_interval = #{@in_interval} at #{@filename}:#{@lineno}") 351 if @in_interval 352 @in_interval = false 353 else 354 # @in_interval = false 355 @in_interval = true 356 end 357 @@logger.debug("DADLScanner#scan: SYM_INTERVAL_DELIM at #{@filename}:#{@lineno}") 358 yield :SYM_INTERVAL_DELIM, :SYM_INTERVAL_DELIM 359 when /\A\[([a-zA-Z0-9()\._-]+::[a-zA-Z0-9\._-]+)\]/ #V_QUALIFIED_TERM_CODE_REF form [ICD10AM(1998)::F23] 360 yield :V_QUALIFIED_TERM_CODE_REF, $1 361 when /\A\[/ # [ 362 @@logger.debug("DADLScanner#scan: Left_bracket_code at #{@filename}:#{@lineno}") 363 yield :Left_bracket_code, :Left_bracket_code 364 when /\A\]/ # ] 365 @@logger.debug("DADLScanner#scan: Right_bracket_code at #{@filename}:#{@lineno}") 366 yield :Right_bracket_code, :Right_bracket_code 367 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-]- 368 @@logger.debug("DADLScanner#scan: V_ISO8601_EXTENDED_DATE_TIME") 369 yield :V_ISO8601_EXTENDED_DATE_TIME, $& 370 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] 371 @@logger.debug("DADLScanner#scan: V_ISO8601_EXTENDED_TIME") 372 yield :V_ISO8601_EXTENDED_TIME, $& 373 when /\A\d{4}-[0-1][0-9]-[0-3][0-9]|[0-9]{4}-[0-1][0-9]/ #V_ISO8601_EXTENDED_DATE YYYY-MM-DD 374 @@logger.debug("DADLScanner#scan: V_ISO8601_EXTENDED_DATE, #{$&}") 375 yield :V_ISO8601_EXTENDED_DATE, $& 376 when /\A[A-Z][a-zA-Z0-9_]*<[a-zA-Z0-9,_<>]+>/ #V_GENERIC_TYPE_IDENTIFIER 377 yield :V_GENERIC_TYPE_IDENTIFIER, $& 378 when /\A"((?:[^"\\]+|\\.)*)"/ #V_STRING 379 @@logger.debug("DADLScanner#scan: V_STRING, #{$1}") 380 yield :V_STRING, $1 381 when /\A"([^"]*)"/m #V_STRING 382 @@logger.debug("DADLScanner#scan: V_STRING, #{$1}") 383 yield :V_STRING, $1 384 when /\A[0-9]+|[0-9]+[eE][+-]?[0-9]+/ #V_INTEGER 385 @@logger.debug("DADLScanner#scan: V_INTEGER = #{$&}") 386 yield :V_INTEGER, $& 387 when /\A[a-z]+:\/\/[^<>|\\{}^~"\[\] ]*/ #V_URI 388 yield :V_URI, $& 389 when /\A\S/ #UTF8CHAR 390 yield :UTF8CHAR, $& 391 end 392 data = $' # variable $' receives the string after the match 393 when :adl 394 adl_scanner = OpenEHR::ADL::Scanner::ADLScanner.new(@adl_type, @filename, @lineno) 395 data = adl_scanner.scan(data) do |sym, val| 396 yield sym, val 397 end 398 when :cadl 399 cadl_scanner = OpenEHR::ADL::Scanner::CADLScanner.new(@adl_type, @filename, @lineno) 400 data = cadl_scanner.scan(data) do |sym, val| 401 yield sym, val 402 end 403 when :regexp 404 regex_scanner = OpenEHR::ADL::Scanner::RegexScanner.new(@adl_type, @filename, @lineno) 405 data = regex_scanner.scan(data) do |sym, val| 406 yield sym, val 407 end 408 when :term_constraint 409 @@logger.debug("#{__FILE__}:#{__LINE__}: scan_dadl: Entering scan_term_constraint at #{@filename}:#{@lineno}: data = #{data.inspect}") 410 term_constraint_scanner = OpenEHR::ADL::Scanner::TermConstraintScanner.new(@adl_type, @filename, @lineno) 411 data = term_constraint_scanner.scan(data) do |sym, val| 412 yield sym, val 413 end 414 else 415 raise 906 416 end 907 417 end 908 418 end 909 910 # <DADL::Reserved class> 911 class Reserved 912 include Yaparc::Parsable 913 914 def initialize 915 @parser = lambda do |input| 916 reserved_parsers = OpenEHR::ADL::Scanner::DADL::RESERVED.map do |keyword| 917 Yaparc::Tokenize.new( 918 Yaparc::Literal.new(keyword[0],false) 919 ) 920 end 921 Yaparc::Alt.new(Yaparc::Apply.new(Yaparc::Alt.new(*reserved_parsers)) do |match| 922 OpenEHR::LOG.info("Reserved: #{match}") 923 [OpenEHR::ADL::Scanner::DADL::RESERVED[match], OpenEHR::ADL::Scanner::DADL::RESERVED[match]] 924 end, 925 Yaparc::Apply.new(Yaparc::Regex.new(/\A[a-z][a-zA-Z0-9_]*/)) do |match| 926 OpenEHR::LOG.info("V_ATTRIBUTE_IDENTIFIER: #{match}") 927 [:V_ATTRIBUTE_IDENTIFIER, match] 928 end) 929 end 930 end 931 end 932 end # of DADL 933 934 module CADL 935 # c.f. http://www.openehr.org/svn/ref_impl_eiffel/TRUNK/components/adl_parser/src/syntax/cadl/parser/cadl_scanner.l 419 end # of DADLScanner 420 421 422 423 class CADLScanner < Base 424 425 @@logger = OpenEHR::ADL::Scanner::LOGGER #Logger.new('log/scanner.log') #Logger.new('log/scanner.log') 936 426 RESERVED = { 937 'ordered' => :SYM_ORDERED, # [Oo][Rr][Dd][Ee][Rr][Ee][Dd]938 'unordered' => :SYM_UNORDERED, # [Uu][Nn][Oo][Rr][Dd][Ee][Rr][Ee][Dd]939 427 'then' => :SYM_THEN, # [Tt][Hh][Ee][Nn] 940 428 'else' => :SYM_ELSE, # [Ee][Ll][Ss][Ee] … … 951 439 'occurrences' => :SYM_OCCURRENCES, # [Oo][Cc][Cc][Uu][Rr][Rr][Ee][Nn][Cc][Ee][Ss] 952 440 'cardinality' => :SYM_CARDINALITY, # [Cc][Aa][Rr][Dd][Ii][Nn][Aa][Ll][Ii][Tt][Yy] 441 'ordered' => :SYM_ORDERED, # [Oo][Rr][Dd][Ee][Rr][Ee][Dd] 442 'unordered' => :SYM_UNORDERED, # [Uu][Nn][Oo][Rr][Dd][Ee][Rr][Ee][Dd] 953 443 'unique' => :SYM_UNIQUE, # [Uu][Nn][Ii][Qq][Uu][Ee] 954 444 'matches' => :SYM_MATCHES, # [Mm][Aa][Tt][Cc][Hh][Ee][Ss] … … 963 453 } 964 454 965 #V_ISO8601_DATE_TIME_CONSTRAINT_PATTERN, /\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]/ 966 class V_ISO8601_DATE_TIME_CONSTRAINT_PATTERN 967 include Yaparc::Parsable 968 def initialize 969 @parser = lambda do |input| 970 Yaparc::Apply.new(Yaparc::Regex.new(/\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]/)) do |match| 971 OpenEHR::LOG.info("V_ISO8601_DATE_TIME_CONSTRAINT_PATTERN: #{match}") 972 [:V_ISO8601_DATE_TIME_CONSTRAINT_PATTERN, match] 973 end 455 def initialize(adl_type, filename, lineno = 1) 456 super(adl_type, filename, lineno) 457 @in_interval = false 458 end 459 460 # 461 # CADLScanner#scan 462 # 463 def scan(data) 464 @@logger.debug("#{__FILE__}:#{__LINE__}: Entering CADLScanner#scan at #{@filename}:#{@lineno}: data = #{data.inspect}") 465 until data.nil? do 466 @@logger.debug("CADLScanner#scan: loop data = #{data.inspect}") 467 case @adl_type.last 468 when :cadl 469 case data 470 when /\A\n/ # carriage return 471 @lineno += 1 472 ; 473 #yield :CR, :CR 474 when /\A[ \t\r\f]+/ #just drop it 475 ; 476 when /\A--.*\n/ # single line comment 477 @lineno += 1 478 ; 479 ###----------/* symbols */ ------------------------------------------------- 480 when /\A\=/ # = 481 yield :SYM_EQ, :SYM_EQ 482 when /\A\>=/ # >= 483 yield :SYM_GE, :SYM_GE 484 when /\A\<=/ # <= 485 yield :SYM_LE, :SYM_LE 486 when /\A\</ # < 487 if @in_interval 488 yield :SYM_LT, :SYM_LT 489 else 490 @adl_type.push(:dadl) 491 yield :SYM_START_DBLOCK, $& 492 end 493 when /\A\>/ # > 494 if @in_interval 495 yield :SYM_GT, :SYM_GT 496 else 497 adl_type = @adl_type.pop 498 assert_at(__FILE__,__LINE__){adl_type == :dadl} 499 yield :SYM_END_DBLOCK, :SYM_END_DBLOCK 500 end 501 when /\A\-/ # - 502 yield :Minus_code, :Minus_code 503 when /\A\+/ # + 504 yield :Plus_code, :Plus_code 505 when /\A\*/ # * 506 yield :Star_code, :Star_code 507 when /\A\// # / 508 yield :Slash_code, :Slash_code 509 when /\A\^/ # ^ 510 yield :Caret_code, :Caret_code 511 when /\A\.\.\./ # ... 512 yield :SYM_LIST_CONTINUE, :SYM_LIST_CONTINUE 513 when /\A\.\./ # .. 514 yield :SYM_ELLIPSIS, :SYM_ELLIPSIS 515 when /\A\./ # . 516 yield :Dot_code, :Dot_code 517 when /\A\;/ # ; 518 yield :Semicolon_code, :Semicolon_code 519 when /\A\,/ # , 520 yield :Comma_code, :Comma_code 521 when /\A\:/ # : 522 yield :Colon_code, :Colon_code 523 when /\A\!/ # ! 524 yield :Exclamation_code, :Exclamation_code 525 when /\A\(/ # ( 526 yield :Left_parenthesis_code, :Left_parenthesis_code 527 when /\A\)/ # ) 528 yield :Right_parenthesis_code, :Right_parenthesis_code 529 when /\A\{\// #V_REGEXP 530 if @adl_type.last != :regexp 531 @in_regexp = true 532 @adl_type.push(:regexp) 533 yield :START_REGEXP_BLOCK, :START_REGEXP_BLOCK 534 else 535 raise 536 end 537 when /\A\{/ # { 538 @adl_type.push(:cadl) 539 @@logger.debug("CADLScanner#scan: entering cADL at #{@filename}:#{@lineno}") 540 yield :SYM_START_CBLOCK, :SYM_START_CBLOCK 541 when /\A\}/ # } 542 adl_type = @adl_type.pop 543 assert_at(__FILE__,__LINE__){adl_type == :cadl} 544 @@logger.debug("CADLScanner#scan: exiting cADL at #{@filename}:#{@lineno}") 545 yield :SYM_END_CBLOCK, :SYM_END_CBLOCK 546 when /\A\$/ # $ 547 yield :Dollar_code, :Dollar_code 548 when /\A\?\?/ # ?? 549 yield :SYM_DT_UNKNOWN, :SYM_DT_UNKNOWN 550 when /\A\?/ # ? 551 yield :Question_mark_code, :Question_mark_code 552 when /\A\|/ # | 553 @@logger.debug("CADLScanner#scan: @in_interval = #{@in_interval} at #{@filename}:#{@lineno}") 554 if @in_interval 555 @in_interval = false 556 else 557 # @in_interval = false 558 @in_interval = true 559 end 560 @@logger.debug("CADLScanner#scan: SYM_INTERVAL_DELIM at #{@filename}:#{@lineno}") 561 yield :SYM_INTERVAL_DELIM, :SYM_INTERVAL_DELIM 562 563 when /\A\[([a-zA-Z0-9()\._-]+::[a-zA-Z0-9\._-]+)\]/ #V_QUALIFIED_TERM_CODE_REF form [ICD10AM(1998)::F23] 564 yield :V_QUALIFIED_TERM_CODE_REF, $1 565 when /\A\[[a-zA-Z0-9._\- ]+::[a-zA-Z0-9._\- ]+\]/ #ERR_V_QUALIFIED_TERM_CODE_REF 566 yield :ERR_V_QUALIFIED_TERM_CODE_REF, $& 567 when /\A\[([a-zA-Z0-9\(\)\._\-]+)::[ \t\n]*/ 568 @adl_type.push(:term_constraint) 569 yield :START_TERM_CODE_CONSTRAINT, $1 570 when /\A\[[a-zA-Z0-9][a-zA-Z0-9._\-]*\]/ #V_LOCAL_TERM_CODE_REF 571 yield :V_LOCAL_TERM_CODE_REF, $& 572 when /\A\[/ # [ 573 yield :Left_bracket_code, :Left_bracket_code 574 when /\A\]/ # ] 575 yield :Right_bracket_code, :Right_bracket_code 576 when /\A[A-Z][a-zA-Z0-9_]*<[a-zA-Z0-9,_<>]+>/ #V_GENERIC_TYPE_IDENTIFIER 577 yield :V_GENERIC_TYPE_IDENTIFIER, $& 578 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]/ 579 yield :V_ISO8601_DATE_TIME_CONSTRAINT_PATTERN, $& 580 when /\A[yY][yY][yY][yY]-[mM?X][mM?X]-[dD?X][dD?X]/ 581 yield :V_ISO8601_DATE_CONSTRAINT_PATTERN, $& 582 when /\A[hH][hH]:[mM?X][mM?X]:[sS?X][sS?X]/ 583 yield :V_ISO8601_TIME_CONSTRAINT_PATTERN, $& 584 #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 such as PnYnMnWnDTnnHnnMnnS 585 when /\AP([0-9]+[yY])?([0-9]+[mM])?([0-9]+[wW])?([0-9]+[dD])?T([0-9]+[hH])?([0-9]+[mM])?([0-9]+[sS])?/ #V_ISO8601_DURATION such as PnYnMnWnDTnnHnnMnnS 586 yield :V_ISO8601_DURATION, $& 587 when /\AP[yY]?[mM]?[wW]?[dD]?T[hH]?[mM]?[sS]?/ #V_ISO8601_DURATION_CONSTRAINT_PATTERNo 588 yield :V_ISO8601_DURATION_CONSTRAINT_PATTERN, $& 589 when /\A[a-z][a-zA-Z0-9_]*/ 590 word = $&.dup 591 if RESERVED[word.downcase] 592 yield RESERVED[word.downcase], RESERVED[word.downcase] 593 else 594 @@logger.debug("CADLScanner#scan: V_ATTRIBUTE_IDENTIFIER = #{word} at #{@filename}:#{@lineno}") 595 yield :V_ATTRIBUTE_IDENTIFIER, word #V_ATTRIBUTE_IDENTIFIER /\A[a-z][a-zA-Z0-9_]*/ 596 end 597 when /\A[A-Z][a-zA-Z0-9_]*/ 598 word = $&.dup 599 if RESERVED[word.downcase] 600 yield RESERVED[word.downcase], RESERVED[word.downcase] 601 else 602 yield :V_TYPE_IDENTIFIER, $& 603 end 604 when /\Aa[ct][0-9.]+/ #V_LOCAL_CODE 605 yield :V_LOCAL_CODE, $& 606 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-]- 607 yield :V_ISO8601_EXTENDED_DATE_TIME, $& 608 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] 609 yield :V_ISO8601_EXTENDED_TIME, $& 610 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 611 yield :V_ISO8601_EXTENDED_DATE, $& 612 when /\A[0-9]+|[0-9]+[eE][+-]?[0-9]+/ #V_INTEGER 613 @@logger.debug("CADLScanner#scan: V_INTEGER = #{$&}") 614 yield :V_INTEGER, $& 615 when /\A[0-9]+\.[0-9]+|[0-9]+\.[0-9]+[eE][+-]?[0-9]+ / #V_REAL 616 yield :V_REAL, $& 617 when /\A"((?:[^"\\]+|\\.)*)"/ #V_STRING 618 yield :V_STRING, $1 619 when /\A"([^"]*)"/m #V_STRING 620 yield :V_STRING, $1 621 when /\A[a-z]+:\/\/[^<>|\\{}^~"\[\] ]*/ #V_URI 622 yield :V_URI, $& 623 when /\A\S/ #UTF8CHAR 624 yield :UTF8CHAR, $& 625 when /\A.+/ # 626 raise OpenEHR::ADL::Exception::CADLScanner::Base.new, "can't handle #{data.inspect}" 627 end 628 data = $' # variable $' receives the string after the match 629 when :adl 630 adl_scanner = OpenEHR::ADL::Scanner::ADLScanner.new(@adl_type, @filename, @lineno) 631 data = adl_scanner.scan(data) do |sym, val| 632 yield sym, val 633 end 634 when :dadl 635 dadl_scanner = OpenEHR::ADL::Scanner::DADLScanner.new(@adl_type, @filename, @lineno) 636 data = dadl_scanner.scan(data) do |sym, val| 637 yield sym, val 638 end 639 when :regexp 640 regex_scanner = OpenEHR::ADL::Scanner::RegexScanner.new(@adl_type, @filename, @lineno) 641 data = regex_scanner.scan(data) do |sym, val| 642 yield sym, val 643 end 644 when :term_constraint 645 @@logger.debug("Entering scan_term_constraint at #{@filename}:#{@lineno}: data = #{data.inspect}") 646 term_constraint_scanner = OpenEHR::ADL::Scanner::TermConstraintScanner.new(@adl_type, @filename, @lineno) 647 data = term_constraint_scanner.scan(data) do |sym, val| 648 yield sym, val 649 end 650 else 651 raise OpenEHR::ADL::Exception::CADLScanner.new, "unexpected adl_type: #{@adl_type.last}" 652 end 653 end # of until 654 end 655 end # of CADLScanner 656 657 658 # 659 # RegexScanner 660 # 661 class RegexScanner < Base 662 663 @@logger = OpenEHR::ADL::Scanner::LOGGER #Logger.new('log/scanner.log') #Logger.new('log/scanner.log') 664 665 def initialize(adl_type, filename, lineno = 1) 666 super(adl_type, filename, lineno) 667 end 668 669 def scan(data) 670 @@logger.debug("#{__FILE__}:#{__LINE__}: Entering scan_regexp at #{@filename}:#{@lineno}: data = #{data.inspect}") 671 until data.nil? do 672 case @adl_type.last 673 when :regexp 674 case data 675 when /\A\/\}/ #V_REGEXP 676 if @adl_type.last == :regexp 677 @in_regexp = false 678 @adl_type.pop 679 yield :END_REGEXP_BLOCK, :END_REGEXP_BLOCK 680 else 681 raise 682 end 683 when /\A(.*)(\/\})/ #V_REGEXP 684 yield :REGEXP_BODY, $1 685 if @adl_type.last == :regexp 686 @in_regexp = false 687 @adl_type.pop 688 yield :END_REGEXP_BLOCK, :END_REGEXP_BLOCK 689 else 690 raise 691 end 692 else 693 raise data 694 end 695 data = $' # variable $' receives the string after the match 696 when :adl 697 adl_scanner = OpenEHR::ADL::Scanner::ADLScanner.new(@adl_type, @filename, @lineno) 698 data = adl_scanner.scan(data) do |sym, val| 699 yield sym, val 700 end 701 when :dadl 702 dadl_scanner = OpenEHR::ADL::Scanner::DADLScanner.new(@adl_type, @filename, @lineno) 703 data = dadl_scanner.scan(data) do |sym, val| 704 yield sym, val 705 end 706 when :cadl 707 cadl_scanner = OpenEHR::ADL::Scanner::CADLScanner.new(@adl_type, @filename, @lineno) 708 data = cadl_scanner.scan(data) do |sym, val| 709 yield sym, val 710 end 711 when :term_constraint 712 #@@logger.debug("#{__FILE__}:#{__LINE__}: scan_regexp: Entering scan_term_constraint at #{@filename}:#{@lineno}") 713 term_constraint_scanner = OpenEHR::ADL::Scanner::TermConstraintScanner.new(@adl_type, @filename, @lineno) 714 data = term_constraint_scanner.scan(data) do |sym, val| 715 yield sym, val 716 end 717 else 718 raise 974 719 end 975 720 end 976 721 end 977 978 #V_ISO8601_DATE_CONSTRAINT_PATTERN /\A[yY][yY][yY][yY]-[mM?X][mM?X]-[dD?X][dD?X]/ 979 class V_ISO8601_DATE_CONSTRAINT_PATTERN 980 include Yaparc::Parsable 981 def initialize 982 @parser = lambda do |input| 983 Yaparc::Apply.new(Yaparc::Regex.new(/\A[yY][yY][yY][yY]-[mM?X][mM?X]-[dD?X][dD?X]/)) do |match| 984 OpenEHR::LOG.info("V_ISO8601_DATE_CONSTRAINT_PATTERN: #{match}") 985 [:V_ISO8601_DATE_CONSTRAINT_PATTERN, match] 986 end 722 end # of RegexScanner 723 724 # 725 # TermConstraintScanner 726 # 727 class TermConstraintScanner < Base 728 @@logger = OpenEHR::ADL::Scanner::LOGGER #Logger.new('log/scanner.log') #Logger.new('log/scanner.log') 729 def initialize(adl_type, filename, lineno = 1) 730 super(adl_type, filename, lineno) 731 end 732 733 def scan(data) 734 @@logger.debug("#{__FILE__}:#{__LINE__}: Entering scan_term_constraint") 735 until data.nil? do 736 case @adl_type.last 737 when :term_constraint 738 case data 739 when /\A\n/ # carriage return 740 @lineno += 1 741 ; 742 when /\A[ \t\r\f]+/ #just drop it 743 ; 744 when /\A--.*$/ # single line comment 745 @lineno += 1 746 @@logger.debug("#{__FILE__}:#{__LINE__}: scan_term_constraint: COMMENT = #{$&} at #{@filename}:#{@lineno}") 747 ; 748 when /\A([a-zA-Z0-9\._\-])+[ \t]*,/ # match any line, with ',' termination 749 yield :TERM_CODE, $1 750 when /\A([a-zA-Z0-9\._\-])+[ \t]*;/ # match second last line with ';' termination (assumed value) 751 yield :TERM_CODE, $1 752 when /\A([a-zA-Z0-9\._\-])*[ \t]*\]/ # match final line, terminating in ']' 753 adl_type = @adl_type.pop 754 assert_at(__FILE__,__LINE__){adl_type == :term_constraint} 755 yield :END_TERM_CODE_CONSTRAINT, $1 756 else 757 raise "data = #{data}" 758 end 759 data = $' # variable $' receives the string after the match 760 when :adl 761 adl_scanner = OpenEHR::ADL::Scanner::ADLScanner.new(@adl_type, @filename, @lineno) 762 data = adl_scanner.scan(data) do |sym, val| 763 yield sym, val 764 end 765 when :dadl 766 dadl_scanner = OpenEHR::ADL::Scanner::DADLScanner.new(@adl_type, @filename, @lineno) 767 data = dadl_scanner.scan(data) do |sym, val| 768 yield sym, val 769 end 770 when :cadl 771 cadl_scanner = OpenEHR::ADL::Scanner::CADLScanner.new(@adl_type, @filename, @lineno) 772 data = cadl_scanner.scan(data) do |sym, val| 773 yield sym, val 774 end 775 else 776 raise 987 777 end 988 778 end 989 779 end 990 991 #V_ISO8601_TIME_CONSTRAINT_PATTERN /\A[hH][hH]:[mM?X][mM?X]:[sS?X][sS?X]/ 992 class V_ISO8601_TIME_CONSTRAINT_PATTERN 993 include Yaparc::Parsable 994 def initialize 995 @parser = lambda do |input| 996 Yaparc::Apply.new(Yaparc::Regex.new(/\A[hH][hH]:[mM?X][mM?X]:[sS?X][sS?X]/)) do |match| 997 OpenEHR::LOG.info("V_ISO8601_TIME_CONSTRAINT_PATTERN: #{match}") 998 [:V_ISO8601_TIME_CONSTRAINT_PATTERN, match] 999 end 1000 end 1001 end 1002 end 1003 1004 #V_ISO8601_DURATION_CONSTRAINT_PATTERN 1005 class V_ISO8601_DURATION_CONSTRAINT_PATTERN 1006 include Yaparc::Parsable 1007 def initialize 1008 @parser = lambda do |input| 1009 Yaparc::Apply.new(Yaparc::Alt.new(Yaparc::Regex.new(/\AP[yY]?[mM]?[wW]?[dD]?T[hH]?[mM]?[sS]?/), 1010 Yaparc::Regex.new(/\AP[yY]?[mM]?[wW]?[dD]?/))) do |match| 1011 OpenEHR::LOG.info("V_ISO8601_DURATION_CONSTRAINT_PATTERN: #{match}") 1012 [:V_ISO8601_DURATION_CONSTRAINT_PATTERN, match] 1013 end 1014 end 1015 end 1016 end 1017 1018 #V_C_DOMAIN_TYPE /\A[A-Z][a-zA-Z0-9_]*[ \n]*\</ 1019 class V_C_DOMAIN_TYPE 1020 include Yaparc::Parsable 1021 def initialize 1022 @parser = lambda do |input| 1023 Yaparc::Apply.new(Yaparc::Regex.new(/\A[A-Z][a-zA-Z0-9_]*[ \n]*\</)) do |match| 1024 OpenEHR::LOG.info("V_C_DOMAIN_TYPE: #{match}") 1025 [:START_V_C_DOMAIN_TYPE_BLOCK, match] 1026 end 1027 end 1028 end 1029 end 1030 1031 # 1032 # CADL::RootScanner 1033 # 1034 class RootScanner 1035 include Yaparc::Parsable 1036 def initialize 1037 @parser = lambda do |input| 1038 Yaparc::Alt.new(V_ISO8601_DATE_TIME_CONSTRAINT_PATTERN.new, 1039 V_ISO8601_DATE_CONSTRAINT_PATTERN.new, 1040 V_ISO8601_TIME_CONSTRAINT_PATTERN.new, 1041 OpenEHR::ADL::Scanner::Common::V_ISO8601_DURATION.new, 1042 V_C_DOMAIN_TYPE.new, 1043 V_ISO8601_DURATION_CONSTRAINT_PATTERN.new, 1044 Reserved.new, 1045 OpenEHR::ADL::Scanner::Common::V_QUALIFIED_TERM_CODE_REF.new, 1046 OpenEHR::ADL::Scanner::Common::V_LOCAL_TERM_CODE_REF.new, 1047 OpenEHR::ADL::Scanner::Common::ERR_V_QUALIFIED_TERM_CODE_REF.new, 1048 OpenEHR::ADL::Scanner::Common::V_TYPE_IDENTIFIER.new, 1049 OpenEHR::ADL::Scanner::Common::V_GENERIC_TYPE_IDENTIFIER.new, 1050 OpenEHR::ADL::Scanner::Common::V_STRING.new, 1051 OpenEHR::ADL::Scanner::Common::V_LOCAL_CODE.new, 1052 OpenEHR::ADL::Scanner::Common::V_REAL.new, 1053 OpenEHR::ADL::Scanner::Common::V_ISO8601_DURATION.new#, 1054 #OpenEHR::ADL::Scanner::Common::START_TERM_CODE_CONSTRAINT.new 1055 ) 1056 end 1057 end 1058 end 1059 1060 # <CADL::Reserved class> 1061 class Reserved 1062 include Yaparc::Parsable 1063 1064 def initialize 1065 @parser = lambda do |input| 1066 orderd_reserved = RESERVED.keys.sort{|x,y| y.length <=> x.length } 1067 reserved_parsers = orderd_reserved.map do |keyword| 1068 Yaparc::Literal.new(keyword,false) 1069 end 1070 Yaparc::Alt.new(Yaparc::Apply.new(Yaparc::Alt.new(*reserved_parsers)) do |match| 1071 OpenEHR::LOG.info("Reserved: #{match}") 1072 [OpenEHR::ADL::Scanner::CADL::RESERVED[match], OpenEHR::ADL::Scanner::CADL::RESERVED[match]] 1073 end, 1074 Yaparc::Apply.new(Yaparc::Regex.new(/\A[a-z][a-zA-Z0-9_]*/)) do |match| 1075 OpenEHR::LOG.info("V_ATTRIBUTE_IDENTIFIER: #{match}") 1076 [:V_ATTRIBUTE_IDENTIFIER, match] 1077 end) 1078 end 1079 end 1080 end 1081 1082 end 780 end # of TermConstraintScanner 781 1083 782 end 1084 783 end 1085 784 end 785 786 __END__ 787 788 789 790 # module Common 791 # class START_TERM_CODE_CONSTRAINT 792 # include Yaparc::Parsable 793 # def initialize 794 # @parser = lambda do |input| 795 # Yaparc::Apply.new(Yaparc::Regex.new(/[ \t\n]*\[([a-zA-Z0-9\(\)\._\-]+)::[ \t\n]*/)) do |match| 796 # OpenEHR::LOG.info("START_TERM_CODE_CONSTRAINT: #{match}") 797 # [:START_TERM_CODE_CONSTRAINT, match] 798 # end 799 # end 800 # end 801 # end 802 803 # # /\A\[[a-zA-Z0-9()\._-]+::[a-zA-Z0-9\._-]+\]/ #V_QUALIFIED_TERM_CODE_REF form [ICD10AM(1998)::F23] 804 # class V_QUALIFIED_TERM_CODE_REF 805 # include Yaparc::Parsable 806 # def initialize 807 # @parser = lambda do |input| 808 # Yaparc::Apply.new(Yaparc::Regex.new(/\A\[[a-zA-Z0-9()\._-]+::[a-zA-Z0-9\._-]+\]/)) do |match| 809 # OpenEHR::LOG.info("V_QUALIFIED_TERM_CODE_REF: #{match}") 810 # [:V_QUALIFIED_TERM_CODE_REF, match] 811 # end 812 # end 813 # end 814 # end 815 816 # class V_LOCAL_TERM_CODE_REF 817 # include Yaparc::Parsable 818 # def initialize 819 # @parser = lambda do |input| 820 # Yaparc::Apply.new(Yaparc::Regex.new(/\A\[[a-zA-Z0-9][a-zA-Z0-9._\-]*\]/)) do |match| 821 # OpenEHR::LOG.info("V_TERM_CODE_REF: #{match}") 822 # [:V_LOCAL_TERM_CODE_REF, match] 823 # end 824 # end 825 # end 826 # end 827 828 # class ERR_V_QUALIFIED_TERM_CODE_REF 829 # include Yaparc::Parsable 830 # def initialize 831 # @parser = lambda do |input| 832 # Yaparc::Apply.new(Yaparc::Regex.new(/\A\[[a-zA-Z0-9._\- ]+::[a-zA-Z0-9._\- ]+\]/)) do |match| 833 # OpenEHR::LOG.info("ERR_V_QUALIFIED_TERM_CODE_REF: #{match}") 834 # [:ERR_V_QUALIFIED_TERM_CODE_REF, match] 835 # end 836 # end 837 # end 838 # end 839 840 # class V_TYPE_IDENTIFIER 841 # include Yaparc::Parsable 842 # def initialize 843 # @parser = lambda do |input| 844 # Yaparc::Apply.new(Yaparc::Regex.new(/\A[A-Z][a-zA-Z0-9_]*/)) do |match| 845 # OpenEHR::LOG.info("V_TYPE_IDENTIFIER: #{match}") 846 # [:V_TYPE_IDENTIFIER, match] 847 # end 848 # end 849 # end 850 # end 851 852 # class V_GENERIC_TYPE_IDENTIFIER 853 # include Yaparc::Parsable 854 # def initialize 855 # @parser = lambda do |input| 856 # Yaparc::Apply.new(Yaparc::Regex.new(/\A[A-Z][a-zA-Z0-9_]*<[a-zA-Z0-9,_<>]+>/)) do |match| 857 # OpenEHR::LOG.info("V_GENERIC_TYPE_IDENTIFIER: #{match}") 858 # [:V_GENERIC_TYPE_IDENTIFIER, match] 859 # end 860 # end 861 # end 862 # end 863 864 865 # class V_LOCAL_CODE 866 # include Yaparc::Parsable 867 # def initialize 868 # @parser = lambda do |input| 869 # Yaparc::Apply.new(Yaparc::Regex.new(/\Aa[ct][0-9.]+/)) do |match| 870 # OpenEHR::LOG.info("V_LOCAL_CODE: #{match}") 871 # [:V_LOCAL_CODE, match] 872 # end 873 # end 874 # end 875 # end 876 877 # class V_STRING 878 # include Yaparc::Parsable 879 # def initialize 880 # @parser = lambda do |input| 881 # Yaparc::Apply.new(Yaparc::Regex.new(/\A"([^"]*)"/m)) do |match| 882 # OpenEHR::LOG.info("V_STRING: #{match}") 883 # [:V_STRING, match] 884 # end 885 # end 886 # end 887 # end 888 889 # class V_REAL 890 # include Yaparc::Parsable 891 # def initialize 892 # @parser = lambda do |input| 893 # Yaparc::Apply.new(Yaparc::Regex.new(/\A[0-9]+\.[0-9]+|[0-9]+\.[0-9]+[eE][+-]?[0-9]+/)) do |match| 894 # OpenEHR::LOG.info("V_REAL: #{match}") 895 # [:V_REAL, match] 896 # end 897 # end 898 # end 899 # end 900 901 # #V_ISO8601_DURATION PnYnMnWnDTnnHnnMnnS 902 # class V_ISO8601_DURATION 903 # include Yaparc::Parsable 904 # def initialize 905 # @parser = lambda do |input| 906 # Yaparc::Apply.new( 907 # Yaparc::Alt.new(Yaparc::Regex.new(/\AP([0-9]+|[yY])?([0-9]+|[mM])?([0-9]+|[wW])?([0-9]+|[dD])?T([0-9]+|[hH])?([0-9]+|[mM])?([0-9]+|[sS])?/), 908 # Yaparc::Regex.new(/\AP([0-9]+|[yY])?([0-9]+|[mM])?([0-9]+|[wW])?([0-9]+|[dD])?/))) do |match| 909 # OpenEHR::LOG.info("V_ISO8601_DURATION: #{match}") 910 # [:V_ISO8601_DURATION, match] 911 # end 912 # end 913 # end 914 # end 915 916 # end # of Common 917 918 # module DADL 919 # # c.f. http://www.openehr.org/svn/ref_impl_eiffel/TRUNK/components/adl_parser/src/syntax/adl/parser/adl_scanner.l 920 # RESERVED = { 921 # 'true' => :SYM_TRUE, #[Tt][Rr][Uu][Ee] -- -> SYM_TRUE 922 # 'false' => :SYM_FALSE, # [Ff][Aa][Ll][Ss][Ee] -- -> SYM_FALSE 923 # 'infinity' => :SYM_INFINITY # [Ii][Nn][Ff][Ii][Nn][Ii][Tt][Yy] -- -> SYM_INFINITY 924 # } 925 # # 926 # # DADL::RootScanner 927 # # 928 # class RootScanner 929 # include Yaparc::Parsable 930 # def initialize 931 # @parser = lambda do |input| 932 # Yaparc::Alt.new(Reserved.new, 933 # OpenEHR::ADL::Scanner::Common::V_QUALIFIED_TERM_CODE_REF.new, 934 # OpenEHR::ADL::Scanner::Common::V_LOCAL_TERM_CODE_REF.new, 935 # OpenEHR::ADL::Scanner::Common::ERR_V_QUALIFIED_TERM_CODE_REF.new, 936 # OpenEHR::ADL::Scanner::Common::V_TYPE_IDENTIFIER.new, 937 # OpenEHR::ADL::Scanner::Common::V_GENERIC_TYPE_IDENTIFIER.new, 938 # OpenEHR::ADL::Scanner::Common::V_STRING.new, 939 # OpenEHR::ADL::Scanner::Common::V_LOCAL_CODE.new, 940 # OpenEHR::ADL::Scanner::Common::V_REAL.new, 941 # OpenEHR::ADL::Scanner::Common::V_ISO8601_DURATION.new#, 942 # #OpenEHR::ADL::Scanner::Common::START_TERM_CODE_CONSTRAINT.new 943 # ) 944 # end 945 # end 946 # end 947 948 # # <DADL::Reserved class> 949 # class Reserved 950 # include Yaparc::Parsable 951 952 # def initialize 953 # @parser = lambda do |input| 954 # reserved_parsers = OpenEHR::ADL::Scanner::DADL::RESERVED.map do |keyword| 955 # Yaparc::Tokenize.new( 956 # Yaparc::Literal.new(keyword[0],false) 957 # ) 958 # end 959 # Yaparc::Alt.new(Yaparc::Apply.new(Yaparc::Alt.new(*reserved_parsers)) do |match| 960 # OpenEHR::LOG.info("Reserved: #{match}") 961 # [OpenEHR::ADL::Scanner::DADL::RESERVED[match], OpenEHR::ADL::Scanner::DADL::RESERVED[match]] 962 # end, 963 # Yaparc::Apply.new(Yaparc::Regex.new(/\A[a-z][a-zA-Z0-9_]*/)) do |match| 964 # OpenEHR::LOG.info("V_ATTRIBUTE_IDENTIFIER: #{match}") 965 # [:V_ATTRIBUTE_IDENTIFIER, match] 966 # end) 967 # end 968 # end 969 # end 970 # end # of DADL 971 972 # module CADL 973 # # c.f. http://www.openehr.org/svn/ref_impl_eiffel/TRUNK/components/adl_parser/src/syntax/cadl/parser/cadl_scanner.l 974 # RESERVED = { 975 # 'ordered' => :SYM_ORDERED, # [Oo][Rr][Dd][Ee][Rr][Ee][Dd] 976 # 'unordered' => :SYM_UNORDERED, # [Uu][Nn][Oo][Rr][Dd][Ee][Rr][Ee][Dd] 977 # 'then' => :SYM_THEN, # [Tt][Hh][Ee][Nn] 978 # 'else' => :SYM_ELSE, # [Ee][Ll][Ss][Ee] 979 # 'and' => :SYM_AND, # [Aa][Nn][Dd] 980 # 'or' => :SYM_OR, # [Oo][Rr] 981 # 'xor' => :SYM_XOR, # [Xx][Oo][Rr] 982 # 'not' => :SYM_NOT, # [Nn][Oo][Tt] 983 # 'implies' => :SYM_IMPLIES, # [Ii][Mm][Pp][Ll][Ii][Ee][Ss] 984 # 'true' => :SYM_TRUE, #[Tt][Rr][Uu][Ee] -- -> SYM_TRUE 985 # 'false' => :SYM_FALSE, # [Ff][Aa][Ll][Ss][Ee] -- -> SYM_FALSE 986 # 'forall' => :SYM_FORALL, # [Ff][Oo][Rr][_][Aa][Ll][Ll] 987 # 'exists' => :SYM_EXISTS, # [Ee][Xx][Ii][Ss][Tt][Ss] 988 # 'existence' => :SYM_EXISTENCE, # [Ee][Xx][Iu][Ss][Tt][Ee][Nn][Cc][Ee] 989 # 'occurrences' => :SYM_OCCURRENCES, # [Oo][Cc][Cc][Uu][Rr][Rr][Ee][Nn][Cc][Ee][Ss] 990 # 'cardinality' => :SYM_CARDINALITY, # [Cc][Aa][Rr][Dd][Ii][Nn][Aa][Ll][Ii][Tt][Yy] 991 # 'unique' => :SYM_UNIQUE, # [Uu][Nn][Ii][Qq][Uu][Ee] 992 # 'matches' => :SYM_MATCHES, # [Mm][Aa][Tt][Cc][Hh][Ee][Ss] 993 # 'is_in' => :SYM_MATCHES, # [Ii][Ss][_][Ii][Nn] 994 # 'invariant' => :SYM_INVARIANT, # [Ii][Nn][Vv][Aa][Rr][Ii][Aa][Nn][Tt] 995 # 'infinity' => :SYM_INFINITY, # [Ii][Nn][Ff][Ii][Nn][Ii][Tt][Yy] -- -> SYM_INFINITY 996 # 'use_node' => :SYM_USE_NODE, # [Uu][Ss][Ee][_][Nn][Oo][Dd][Ee] 997 # 'use_archetype' => :SYM_ALLOW_ARCHETYPE, # [Uu][Ss][Ee][_][Aa][Rr][Cc][Hh][Ee][Tt][Yy][Pp][Ee] 998 # 'allow_archetype' => :SYM_ALLOW_ARCHETYPE, # [Aa][Ll][Ll][Oo][Ww][_][Aa][Rr][Cc][Hh][Ee][Tt][Yy][Pp][Ee] 999 # 'include' => :SYM_INCLUDE, # [Ii][Nn][Cc][Ll][Uu][Dd][Ee] 1000 # 'exclude' => :SYM_EXCLUDE # [Ee][Xx][Cc][Ll][Uu][Dd][Ee] 1001 # } 1002 1003 # #V_ISO8601_DATE_TIME_CONSTRAINT_PATTERN, /\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]/ 1004 # class V_ISO8601_DATE_TIME_CONSTRAINT_PATTERN 1005 # include Yaparc::Parsable 1006 # def initialize 1007 # @parser = lambda do |input| 1008 # Yaparc::Apply.new(Yaparc::Regex.new(/\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]/)) do |match| 1009 # OpenEHR::LOG.info("V_ISO8601_DATE_TIME_CONSTRAINT_PATTERN: #{match}") 1010 # [:V_ISO8601_DATE_TIME_CONSTRAINT_PATTERN, match] 1011 # end 1012 # end 1013 # end 1014 # end 1015 1016 # #V_ISO8601_DATE_CONSTRAINT_PATTERN /\A[yY][yY][yY][yY]-[mM?X][mM?X]-[dD?X][dD?X]/ 1017 # class V_ISO8601_DATE_CONSTRAINT_PATTERN 1018 # include Yaparc::Parsable 1019 # def initialize 1020 # @parser = lambda do |input| 1021 # Yaparc::Apply.new(Yaparc::Regex.new(/\A[yY][yY][yY][yY]-[mM?X][mM?X]-[dD?X][dD?X]/)) do |match| 1022 # OpenEHR::LOG.info("V_ISO8601_DATE_CONSTRAINT_PATTERN: #{match}") 1023 # [:V_ISO8601_DATE_CONSTRAINT_PATTERN, match] 1024 # end 1025 # end 1026 # end 1027 # end 1028 1029 # #V_ISO8601_TIME_CONSTRAINT_PATTERN /\A[hH][hH]:[mM?X][mM?X]:[sS?X][sS?X]/ 1030 # class V_ISO8601_TIME_CONSTRAINT_PATTERN 1031 # include Yaparc::Parsable 1032 # def initialize 1033 # @parser = lambda do |input| 1034 # Yaparc::Apply.new(Yaparc::Regex.new(/\A[hH][hH]:[mM?X][mM?X]:[sS?X][sS?X]/)) do |match| 1035 # OpenEHR::LOG.info("V_ISO8601_TIME_CONSTRAINT_PATTERN: #{match}") 1036 # [:V_ISO8601_TIME_CONSTRAINT_PATTERN, match] 1037 # end 1038 # end 1039 # end 1040 # end 1041 1042 # #V_ISO8601_DURATION_CONSTRAINT_PATTERN 1043 # class V_ISO8601_DURATION_CONSTRAINT_PATTERN 1044 # include Yaparc::Parsable 1045 # def initialize 1046 # @parser = lambda do |input| 1047 # Yaparc::Apply.new(Yaparc::Alt.new(Yaparc::Regex.new(/\AP[yY]?[mM]?[wW]?[dD]?T[hH]?[mM]?[sS]?/), 1048 # Yaparc::Regex.new(/\AP[yY]?[mM]?[wW]?[dD]?/))) do |match| 1049 # OpenEHR::LOG.info("V_ISO8601_DURATION_CONSTRAINT_PATTERN: #{match}") 1050 # [:V_ISO8601_DURATION_CONSTRAINT_PATTERN, match] 1051 # end 1052 # end 1053 # end 1054 # end 1055 1056 # #V_C_DOMAIN_TYPE /\A[A-Z][a-zA-Z0-9_]*[ \n]*\</ 1057 # class V_C_DOMAIN_TYPE 1058 # include Yaparc::Parsable 1059 # def initialize 1060 # @parser = lambda do |input| 1061 # Yaparc::Apply.new(Yaparc::Regex.new(/\A[A-Z][a-zA-Z0-9_]*[ \n]*\</)) do |match| 1062 # OpenEHR::LOG.info("V_C_DOMAIN_TYPE: #{match}") 1063 # [:START_V_C_DOMAIN_TYPE_BLOCK, match] 1064 # end 1065 # end 1066 # end 1067 # end 1068 1069 # # 1070 # # CADL::RootScanner 1071 # # 1072 # class RootScanner 1073 # include Yaparc::Parsable 1074 # def initialize 1075 # @parser = lambda do |input| 1076 # Yaparc::Alt.new(V_ISO8601_DATE_TIME_CONSTRAINT_PATTERN.new, 1077 # V_ISO8601_DATE_CONSTRAINT_PATTERN.new, 1078 # V_ISO8601_TIME_CONSTRAINT_PATTERN.new, 1079 # OpenEHR::ADL::Scanner::Common::V_ISO8601_DURATION.new, 1080 # V_C_DOMAIN_TYPE.new, 1081 # V_ISO8601_DURATION_CONSTRAINT_PATTERN.new, 1082 # Reserved.new, 1083 # OpenEHR::ADL::Scanner::Common::V_QUALIFIED_TERM_CODE_REF.new, 1084 # OpenEHR::ADL::Scanner::Common::V_LOCAL_TERM_CODE_REF.new, 1085 # OpenEHR::ADL::Scanner::Common::ERR_V_QUALIFIED_TERM_CODE_REF.new, 1086 # OpenEHR::ADL::Scanner::Common::V_TYPE_IDENTIFIER.new, 1087 # OpenEHR::ADL::Scanner::Common::V_GENERIC_TYPE_IDENTIFIER.new, 1088 # OpenEHR::ADL::Scanner::Common::V_STRING.new, 1089 # OpenEHR::ADL::Scanner::Common::V_LOCAL_CODE.new, 1090 # OpenEHR::ADL::Scanner::Common::V_REAL.new, 1091 # OpenEHR::ADL::Scanner::Common::V_ISO8601_DURATION.new#, 1092 # #OpenEHR::ADL::Scanner::Common::START_TERM_CODE_CONSTRAINT.new 1093 # ) 1094 # end 1095 # end 1096 # end 1097 1098 # # <CADL::Reserved class> 1099 # class Reserved 1100 # include Yaparc::Parsable 1101 1102 # def initialize 1103 # @parser = lambda do |input| 1104 # orderd_reserved = RESERVED.keys.sort{|x,y| y.length <=> x.length } 1105 # reserved_parsers = orderd_reserved.map do |keyword| 1106 # Yaparc::Literal.new(keyword,false) 1107 # end 1108 # Yaparc::Alt.new(Yaparc::Apply.new(Yaparc::Alt.new(*reserved_parsers)) do |match| 1109 # OpenEHR::LOG.info("Reserved: #{match}") 1110 # [OpenEHR::ADL::Scanner::CADL::RESERVED[match], OpenEHR::ADL::Scanner::CADL::RESERVED[match]] 1111 # end, 1112 # Yaparc::Apply.new(Yaparc::Regex.new(/\A[a-z][a-zA-Z0-9_]*/)) do |match| 1113 # OpenEHR::LOG.info("V_ATTRIBUTE_IDENTIFIER: #{match}") 1114 # [:V_ATTRIBUTE_IDENTIFIER, match] 1115 # end) 1116 # end 1117 # end 1118 # end 1119 1120 # end 1121 1122 -
ruby/trunk/lib/adl_parser/lib/parser.rb
r265 r283 11 11 $:.unshift File.join(File.dirname(__FILE__)) 12 12 require 'logger' 13 require 'yaml' 13 14 require 'rubygems' 14 15 require 'adl_parser.rb' 15 16 require 'am.rb' 16 17 require 'rm.rb' 17 $DEBUG = true18 $DEBUG = false 18 19 19 20 … … 23 24 class Parser < Racc::Parser 24 25 25 module_eval(<<'...end parser.y/module_eval...', 'parser.y', 120 5)26 module_eval(<<'...end parser.y/module_eval...', 'parser.y', 1208) 26 27 27 28 def assert_at(file,line, message = "") … … 39 40 end 40 41 41 @@dadl_scanner = OpenEHR::ADL::Scanner::DADL::RootScanner.new42 @@cadl_scanner = OpenEHR::ADL::Scanner::CADL::RootScanner.new43 42 44 43 ###----------/* keywords */ --------------------------------------------- … … 103 102 def scan 104 103 @@logger.debug("#{__FILE__}:#{__LINE__}: Entering scan at #{@filename}:#{@lineno}:") 105 adl_scanner = OpenEHR::ADL::Scanner::ADLScanner.new(@adl_type, @filename) 106 cadl_scanner = OpenEHR::ADL::Scanner::CADLScanner.new(@adl_type, @filename) 107 dadl_scanner = OpenEHR::ADL::Scanner::DADLScanner.new(@adl_type, @filename) 108 regex_scanner = OpenEHR::ADL::Scanner::RegexScanner.new(@adl_type, @filename) 109 term_constraint_scanner = OpenEHR::ADL::Scanner::TermConstraintScanner.new(@adl_type, @filename) 104 scanner = OpenEHR::ADL::Scanner::ADLScanner.new(@adl_type, @filename) 110 105 111 106 until @data.nil? do 112 case @adl_type.last 113 when :adl 114 @data = adl_scanner.scan(@data) do |sym, val| 107 @data = scanner.scan(@data) do |sym, val| 115 108 yield sym, val 116 end117 when :dadl118 @data = dadl_scanner.scan(@data) do |sym, val|119 yield sym, val120 end121 when :cadl122 @data = cadl_scanner.scan(@data) do |sym, val|123 yield sym, val124 end125 when :regexp126 @data = regex_scanner.scan(@data) do |sym, val|127 yield sym, val128 end129 when :term_constraint130 @@logger.debug("#{__FILE__}:#{__LINE__}: scan: Entering scan_term_constraint at #{@filename}:#{@lineno}: data = #{@data.inspect}")131 @data = term_constraint_scanner.scan(@data) do |sym, val|132 yield sym, val133 end134 else135 raise136 109 end 137 110 @data = $' # variable $' receives the string after the match … … 140 113 yield false, '$' 141 114 end # of scan 142 143 ### def scan144 ### @@logger.debug("#{__FILE__}:#{__LINE__}: Entering scan at #{@filename}:#{@lineno}:")145 146 ### until @data.nil? do147 ### case @adl_type.last148 ### when :adl149 ### @data = scan_adl(@data) do |sym, val|150 ### yield sym, val151 ### end152 ### when :dadl153 ### @data = scan_dadl(@data) do |sym, val|154 ### yield sym, val155 ### end156 ### when :cadl157 ### @data = scan_cadl(@data) do |sym, val|158 ### yield sym, val159 ### end160 ### when :regexp161 ### @data = scan_regexp(@data) do |sym, val|162 ### yield sym, val163 ### end164 ### when :term_constraint165 ### @@logger.debug("#{__FILE__}:#{__LINE__}: scan: Entering scan_term_constraint at #{@filename}:#{@lineno}: data = #{data.inspect}")166 ### @data = scan_term_constraint(@data) do |sym, val|167 ### yield sym, val168 ### end169 ### else170 ### raise171 ### end172 ### @data = $' # variable $' receives the string after the match173 ### end174 ### yield :EOF, nil175 ### yield false, '$'176 ### end # of scan177 178 def scan_adl(data)179 @@logger.debug("#{__FILE__}:#{__LINE__}: Entering scan_adl at #{@filename}:#{@lineno}: data = #{data.inspect}")180 until data.nil? do181 case @adl_type.last182 when :adl183 case data184 when /\A\n/ # carriage return185 @lineno += 1186 ;187 when /\A[ \t\r\f]+/ #just drop it188 ;189 when /\A--.*\n/ # single line comment190 @lineno += 1191 @@logger.debug("#{__FILE__}:#{__LINE__}: scan_adl: COMMENT = #{$&} at #{@filename}:#{@lineno}")192 ;193 when /\Adescription/ # description194 yield :SYM_DESCRIPTION, :SYM_DESCRIPTION195 when /\Adefinition/ # definition196 yield :SYM_DEFINITION, :SYM_DEFINITION197 ###----------/* symbols */ -------------------------------------------------198 when /\A[A-Z][a-zA-Z0-9_]*/199 yield :V_TYPE_IDENTIFIER, $&200 # when /\A[a-zA-Z][a-zA-Z0-9_-]+\.[a-zA-Z][a-zA-Z0-9_-]+\.[a-zA-Z0-9]+/ #V_ARCHETYPE_ID201 when /\A(\w+)-(\w+)-(\w+)\.(\w+)(-\w+)?\.(v\w+)/ #V_ARCHETYPE_ID202 object_id, rm_originator, rm_name, rm_entity, concept_name, specialisation, version_id = $&, $1, $2, $3, $4, $5, $6203 archetype_id = OpenEHR::RM::Support::Identification::Archetype_ID.new(object_id, concept_name, rm_name, rm_entity, rm_originator, specialisation, version_id)204 # yield :V_ARCHETYPE_ID, $&205 yield :V_ARCHETYPE_ID, archetype_id206 when /\A[a-z][a-zA-Z0-9_]*/207 # word = $&.downcase208 word = $&209 if @@adl_reserved[word]210 @@logger.debug("#{__FILE__}:#{__LINE__}: scan_adl: @@adl_reserved = #{@@adl_reserved[word]} at #{@filename}:#{@lineno}")211 yield @@adl_reserved[word], @@adl_reserved[word]212 elsif #/\A[A-Z][a-zA-Z0-9_]*/213 @@logger.debug("#{__FILE__}:#{__LINE__}: scan_adl: V_ATTRIBUTE_IDENTIFIER = #{$&} at #{@filename}:#{@lineno}")214 yield :V_ATTRIBUTE_IDENTIFIER, $&215 end216 when /\A\=/ # =217 yield :SYM_EQ, :SYM_EQ218 when /\A\>=/ # >=219 yield :SYM_GE, :SYM_GE220 when /\A\<=/ # <=221 yield :SYM_LE, :SYM_LE222 when /\A\</ # <223 if @in_interval224 # @start_block_received = false225 yield :SYM_LT, :SYM_LT226 else227 # @start_block_received = true228 @adl_type.push(:dadl)229 yield :SYM_START_DBLOCK, $&230 end231 when /\A\>/ # >232 if @in_interval233 yield :SYM_GT, :SYM_GT234 else235 adl_type = @adl_type.pop236 assert_at(__FILE__,__LINE__){adl_type == :dadl}237 yield :SYM_END_DBLOCK, :SYM_END_DBLOCK238 end239 when /\A\{/ # {240 @adl_type.push(:cadl)241 @@logger.debug("#{__FILE__}:#{__LINE__}: scan_cadl: entering cADL at #{@filename}:#{@lineno}")242 yield :SYM_START_CBLOCK, :SYM_START_CBLOCK243 when /\A\}/ # }244 adl_type = @adl_type.pop245 # puts "Escaping #{adl_type}"246 assert_at(__FILE__,__LINE__){adl_type == :cadl}247 @@logger.debug("#{__FILE__}:#{__LINE__}: scan_cadl: exiting cADL at #{@filename}:#{@lineno}")248 yield :SYM_END_CBLOCK, $&249 when /\A\-/ # -250 yield :Minus_code, :Minus_code251 when /\A\+/ # +252 yield :Plus_code, :Plus_code253 when /\A\*/ # *254 yield :Star_code, :Star_code255 when /\A\// # /256 yield :Slash_code, :Slash_code257 when /\A\^/ # ^258 yield :Caret_code, :Caret_code259 when /\A\=/ # =260 yield :Equal_code, :Equal_code261 when /\A\.\.\./ # ...262 yield :SYM_LIST_CONTINUE, :SYM_LIST_CONTINUE263 when /\A\.\./ # ..264 yield :SYM_ELLIPSIS, :SYM_ELLIPSIS265 when /\A\./ # .266 yield :Dot_code, :Dot_code267 when /\A\;/ # ;268 yield :Semicolon_code, :Semicolon_code269 when /\A\,/ # ,270 yield :Comma_code, :Comma_code271 when /\A\:/ # :272 yield :Colon_code, :Colon_code273 when /\A\!/ # !274 yield :Exclamation_code, :Exclamation_code275 when /\A\(/ # (276 yield :Left_parenthesis_code, :Left_parenthesis_code277 when /\A\)/ # )278 yield :Right_parenthesis_code, :Right_parenthesis_code279 when /\A\$/ # $280 yield :Dollar_code, :Dollar_code281 when /\A\?\?/ # ??282 yield :SYM_DT_UNKNOWN, :SYM_DT_UNKNOWN283 when /\A\?/ # ?284 yield :Question_mark_code, :Question_mark_code285 when /\A[0-9]+\.[0-9]+(\.[0-9]+)*/ # ?286 yield :V_VERSION_STRING, $&287 when /\A\|/ # |288 if @in_interval289 @in_interval = false290 else291 @in_interval = true292 end293 yield :SYM_INTERVAL_DELIM, :SYM_INTERVAL_DELIM294 when /\A\[[a-zA-Z0-9()\._-]+::[a-zA-Z0-9\._-]+\]/295 # when /\A\[[a-zA-Z0-9()\._-]+\:\:[a-zA-Z0-9\._-]+\]/ #V_QUALIFIED_TERM_CODE_REF form [ICD10AM(1998)::F23]296 yield :V_QUALIFIED_TERM_CODE_REF, $&297 when /\A\[[a-zA-Z0-9][a-zA-Z0-9._\-]*\]/ #V_LOCAL_TERM_CODE_REF298 yield :V_LOCAL_TERM_CODE_REF, $&299 when /\A\[/ # [300 yield :Left_bracket_code, :Left_bracket_code301 when /\A\]/ # ]302 yield :Right_bracket_code, :Right_bracket_code303 304 when /\A"([^"]*)"/m #V_STRING305 yield :V_STRING, $1306 when /\A\[[a-zA-Z0-9._\- ]+::[a-zA-Z0-9._\- ]+\]/ #ERR_V_QUALIFIED_TERM_CODE_REF307 yield :ERR_V_QUALIFIED_TERM_CODE_REF, $&308 when /\Aa[ct][0-9.]+/ #V_LOCAL_CODE309 yield :V_LOCAL_CODE, $&310 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-]-311 yield :V_ISO8601_EXTENDED_DATE_TIME, $&312 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]313 yield :V_ISO8601_EXTENDED_TIME, $&314 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-DD315 yield :V_ISO8601_EXTENDED_DATE, $&316 when /\A[A-Z][a-zA-Z0-9_]*<[a-zA-Z0-9,_<>]+>/ #V_GENERIC_TYPE_IDENTIFIER317 yield :V_GENERIC_TYPE_IDENTIFIER, $&318 when /\A[0-9]+|[0-9]+[eE][+-]?[0-9]+/ #V_INTEGER319 yield :V_INTEGER, $&320 when /\A[0-9]+\.[0-9]+|[0-9]+\.[0-9]+[eE][+-]?[0-9]+ / #V_REAL321 yield :V_REAL, $&322 # when /\A"((?:[^"\\]+|\\.)*)"/ #V_STRING323 when /\A[a-z]+:\/\/[^<>|\\{}^~"\[\] ]*/ #V_URI324 yield :V_URI, $&325 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 PnYnMnWnDTnnHnnMnnS326 yield :V_ISO8601_DURATION, $&327 when /\A\S/ #UTF8CHAR328 yield :UTF8CHAR, $&329 end330 data = $' # variable $' receives the string after the match331 when :dadl332 data = scan_dadl(data) do |sym, val|333 yield sym, val334 end335 when :cadl336 data = scan_cadl(data) do |sym, val|337 yield sym, val338 end339 when :regexp340 data = scan_regexp(data) do |sym, val|341 yield sym, val342 end343 when :term_constraint344 @@logger.debug("#{__FILE__}:#{__LINE__}: scan_adl: Entering scan_term_constraint at #{@filename}:#{@lineno}: data = #{data.inspect}")345 346 data = scan_term_constraint(data) do |sym, val|347 yield sym, val348 end349 else350 raise351 end352 end353 end # scan_adl354 355 356 def scan_cadl(data)357 @@logger.debug("#{__FILE__}:#{__LINE__}: Entering scan_cadl at #{@filename}:#{@lineno}: data = #{data.inspect}")358 until data.nil? do359 case @adl_type.last360 when :cadl361 case scanned = @@cadl_scanner.parse(data)362 when Yaparc::Result::OK363 if scanned.value[0] == :START_V_C_DOMAIN_TYPE_BLOCK364 @in_c_domain_type = true365 @adl_type.push(:dadl)366 yield scanned.value367 else368 yield scanned.value369 end370 data = scanned.input371 end372 373 case data374 when /\A\n/ # carriage return375 @lineno += 1376 ;377 when /\A[ \t\r\f]+/ #just drop it378 ;379 when /\A--.*\n/ # single line comment380 @lineno += 1381 @@logger.debug("#{__FILE__}:#{__LINE__}: scan_cadl: COMMENT = #{$&} at #{@filename}:#{@lineno}")382 ;383 ###----------/* symbols */ -------------------------------------------------384 when /\A\=/ # =385 yield :SYM_EQ, :SYM_EQ386 when /\A\>=/ # >=387 yield :SYM_GE, :SYM_GE388 when /\A\<=/ # <=389 yield :SYM_LE, :SYM_LE390 ### when /\A[A-Z][a-zA-Z0-9_]*[ \n]*\</ # V_C_DOMAIN_TYPE391 ### @in_c_domain_type = true392 ### @adl_type.push(:dadl)393 ### yield :START_V_C_DOMAIN_TYPE_BLOCK, $&394 when /\A\</ # <395 if @in_interval396 yield :SYM_LT, :SYM_LT397 else398 @adl_type.push(:dadl)399 yield :SYM_START_DBLOCK, $&400 end401 when /\A\>/ # >402 if @in_interval403 yield :SYM_GT, :SYM_GT404 else405 adl_type = @adl_type.pop406 # puts "Escaping #{adl_type}"407 assert_at(__FILE__,__LINE__){adl_type == :dadl}408 yield :SYM_END_DBLOCK, :SYM_END_DBLOCK409 end410 when /\A\-/ # -411 yield :Minus_code, :Minus_code412 when /\A\+/ # +413 yield :Plus_code, :Plus_code414 when /\A\*/ # *415 yield :Star_code, :Star_code416 when /\A\// # /417 yield :Slash_code, :Slash_code418 when /\A\^/ # ^419 yield :Caret_code, :Caret_code420 when /\A\.\.\./ # ...421 yield :SYM_LIST_CONTINUE, :SYM_LIST_CONTINUE422 when /\A\.\./ # ..423 yield :SYM_ELLIPSIS, :SYM_ELLIPSIS424 when /\A\./ # .425 yield :Dot_code, :Dot_code426 when /\A\;/ # ;427 yield :Semicolon_code, :Semicolon_code428 when /\A\,/ # ,429 yield :Comma_code, :Comma_code430 when /\A\:/ # :431 yield :Colon_code, :Colon_code432 when /\A\!/ # !433 yield :Exclamation_code, :Exclamation_code434 when /\A\(/ # (435 yield :Left_parenthesis_code, :Left_parenthesis_code436 when /\A\)/ # )437 yield :Right_parenthesis_code, :Right_parenthesis_code438 when /\A\{\// #V_REGEXP439 if @adl_type.last != :regexp440 @in_regexp = true441 @adl_type.push(:regexp)442 yield :START_REGEXP_BLOCK, :START_REGEXP_BLOCK443 else444 raise445 end446 # yield :V_REGEXP, :V_REGEXP447 when /\A\{/ # {448 @adl_type.push(:cadl)449 @@logger.debug("#{__FILE__}:#{__LINE__}: scan_cadl: entering cADL at #{@filename}:#{@lineno}")450 yield :SYM_START_CBLOCK, :SYM_START_CBLOCK451 when /\A\}/ # }452 adl_type = @adl_type.pop453 # puts "Escaping #{adl_type}"454 assert_at(__FILE__,__LINE__){adl_type == :cadl}455 @@logger.debug("#{__FILE__}:#{__LINE__}: scan_cadl: exiting cADL at #{@filename}:#{@lineno}")456 yield :SYM_END_CBLOCK, :SYM_END_CBLOCK457 when /\A\$/ # $458 yield :Dollar_code, :Dollar_code459 when /\A\?\?/ # ??460 yield :SYM_DT_UNKNOWN, :SYM_DT_UNKNOWN461 when /\A\?/ # ?462 yield :Question_mark_code, :Question_mark_code463 when /\A\|/ # |464 @@logger.debug("#{__FILE__}:#{__LINE__}: scan_cadl: @in_interval = #{@in_interval} at #{@filename}:#{@lineno}")465 if @in_interval466 @in_interval = false467 else468 # @in_interval = false469 @in_interval = true470 end471 @@logger.debug("#{__FILE__}:#{__LINE__}: scan_cadl: SYM_INTERVAL_DELIM at #{@filename}:#{@lineno}")472 yield :SYM_INTERVAL_DELIM, :SYM_INTERVAL_DELIM473 474 when /\A\[[a-zA-Z0-9()\._-]+::[a-zA-Z0-9\._-]+\]/ #V_QUALIFIED_TERM_CODE_REF form [ICD10AM(1998)::F23]475 # when /\A\[[a-zA-Z0-9._\-]+::[a-zA-Z0-9._\-]+\]/ #V_QUALIFIED_TERM_CODE_REF form [ICD10AM(1998)::F23]476 yield :V_QUALIFIED_TERM_CODE_REF, $&477 when /\A\[[a-zA-Z0-9._\- ]+::[a-zA-Z0-9._\- ]+\]/ #ERR_V_QUALIFIED_TERM_CODE_REF478 yield :ERR_V_QUALIFIED_TERM_CODE_REF, $&479 when /\A\[([a-zA-Z0-9\(\)\._\-]+)::[ \t\n]*/480 @adl_type.push(:term_constraint)481 yield :START_TERM_CODE_CONSTRAINT, $1482 when /\A\[[a-zA-Z0-9][a-zA-Z0-9._\-]*\]/ #V_LOCAL_TERM_CODE_REF483 yield :V_LOCAL_TERM_CODE_REF, $&484 when /\A\[/ # [485 yield :Left_bracket_code, :Left_bracket_code486 when /\A\]/ # ]487 yield :Right_bracket_code, :Right_bracket_code488 when /\A[A-Z][a-zA-Z0-9_]*<[a-zA-Z0-9,_<>]+>/ #V_GENERIC_TYPE_IDENTIFIER489 yield :V_GENERIC_TYPE_IDENTIFIER, $&490 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]/491 yield :V_ISO8601_DATE_TIME_CONSTRAINT_PATTERN, $&492 when /\A[yY][yY][yY][yY]-[mM?X][mM?X]-[dD?X][dD?X]/493 yield :V_ISO8601_DATE_CONSTRAINT_PATTERN, $&494 when /\A[hH][hH]:[mM?X][mM?X]:[sS?X][sS?X]/495 yield :V_ISO8601_TIME_CONSTRAINT_PATTERN, $&496 when /\A[a-z][a-zA-Z0-9_]*/497 word = $&.dup498 if @@cadl_reserved[word.downcase]499 yield @@cadl_reserved[word.downcase], @@cadl_reserved[word.downcase]500 else501 @@logger.debug("#{__FILE__}:#{__LINE__}: scan_cadl: V_ATTRIBUTE_IDENTIFIER = #{word} at #{@filename}:#{@lineno}")502 yield :V_ATTRIBUTE_IDENTIFIER, word #V_ATTRIBUTE_IDENTIFIER /\A[a-z][a-zA-Z0-9_]*/503 end504 when /\A[A-Z][a-zA-Z0-9_]*/505 word = $&.dup506 if @@cadl_reserved[word.downcase]507 yield @@cadl_reserved[word.downcase], @@cadl_reserved[word.downcase]508 else509 yield :V_TYPE_IDENTIFIER, $&510 end511 when /\Aa[ct][0-9.]+/ #V_LOCAL_CODE512 yield :V_LOCAL_CODE, $&513 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-]-514 yield :V_ISO8601_EXTENDED_DATE_TIME, $&515 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]516 yield :V_ISO8601_EXTENDED_TIME, $&517 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-DD518 yield :V_ISO8601_EXTENDED_DATE, $&519 when /\A[0-9]+|[0-9]+[eE][+-]?[0-9]+/ #V_INTEGER520 yield :V_INTEGER, $&521 when /\A[0-9]+\.[0-9]+|[0-9]+\.[0-9]+[eE][+-]?[0-9]+ / #V_REAL522 yield :V_REAL, $&523 when /\A"((?:[^"\\]+|\\.)*)"/ #V_STRING524 when /\A"([^"]*)"/m #V_STRING525 yield :V_STRING, $1526 when /\A[a-z]+:\/\/[^<>|\\{}^~"\[\] ]*/ #V_URI527 yield :V_URI, $&528 ### 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 PnYnMnWnDTnnHnnMnnS529 ### yield :V_ISO8601_DURATION, $&530 when /\A\S/ #UTF8CHAR531 yield :UTF8CHAR, $&532 else533 raise534 end535 data = $' # variable $' receives the string after the match536 when :adl537 data = scan_adl(data) do |sym, val|538 yield sym, val539 end540 when :dadl541 data = scan_dadl(data) do |sym, val|542 yield sym, val543 end544 when :regexp545 data = scan_regexp(data) do |sym, val|546 yield sym, val547 end548 when :term_constraint549 @@logger.debug("#{__FILE__}:#{__LINE__}: scan_cadl: Entering scan_term_constraint at #{@filename}:#{@lineno}: data = #{data.inspect}")550 551 data = scan_term_constraint(data) do |sym, val|552 yield sym, val553 end554 else555 raise556 end557 end # of until558 end # of scan_cadl559 560 def scan_dadl(data)561 @@logger.debug("#{__FILE__}:#{__LINE__}: Entering scan_dadl at #{@filename}:#{@lineno}: data = #{data.inspect}")562 until data.nil? do563 case @adl_type.last564 when :dadl565 case scanned = @@dadl_scanner.parse(data)566 when Yaparc::Result::OK567 yield scanned.value568 data = scanned.input569 else570 end571 572 case data573 when /\A\n/ # carriage return574 @lineno += 1575 ;576 when /\A[ \t\r\f]+/ #just drop it577 ;578 when /\A--.*\n/ # single line comment579 @lineno += 1580 @@logger.debug("#{__FILE__}:#{__LINE__}: scan_dadl: COMMENT = #{$&} at #{@filename}:#{@lineno}")581 ;582 ###----------/* symbols */ -------------------------------------------------583 when /\A\=/ # =584 yield :SYM_EQ, :SYM_EQ585 when /\A\>\=/ # >=586 yield :SYM_GE, :SYM_GE587 when /\A\<\=/ # <=588 yield :SYM_LE, :SYM_LE589 when /\A\</ # <590 if @in_interval591 yield :SYM_LT, :SYM_LT592 else593 @adl_type.push(:dadl)594 yield :SYM_START_DBLOCK, :SYM_START_DBLOCK595 end596 when /\A\>/ # >597 if @in_interval598 # @in_interval = false599 yield :SYM_GT, :SYM_GT600 elsif @in_c_domain_type == true601 assert_at(__FILE__,__LINE__){@adl_type.last == :dadl}602 adl_type = @adl_type.pop603 if @adl_type.last == :cadl604 @in_c_domain_type = false605 yield :END_V_C_DOMAIN_TYPE_BLOCK, $&606 else607 yield :SYM_END_DBLOCK, $&608 end609 elsif @in_c_domain_type == false610 adl_type = @adl_type.pop611 assert_at(__FILE__,__LINE__){adl_type == :dadl}612 yield :SYM_END_DBLOCK, $&613 else614 raise615 end616 when /\A\-/ # -617 yield :Minus_code, :Minus_code618 when /\A\+/ # +619 yield :Plus_code, :Plus_code620 when /\A\*/ # *621 yield :Star_code, :Star_code622 when /\A\// # /623 yield :Slash_code, :Slash_code624 when /\A\^/ # ^625 yield :Caret_code, :Caret_code626 when /\A\.\.\./ # ...627 yield :SYM_LIST_CONTINUE, :SYM_LIST_CONTINUE628 when /\A\.\./ # ..629 yield :SYM_ELLIPSIS, :SYM_ELLIPSIS630 when /\A\./ # .631 yield :Dot_code, :Dot_code632 when /\A\;/ # ;633 yield :Semicolon_code, :Semicolon_code634 when /\A\,/ # ,635 yield :Comma_code, :Comma_code636 when /\A\:/ # :637 yield :Colon_code, :Colon_code638 when /\A\!/ # !639 yield :Exclamation_code, :Exclamation_code640 when /\A\(/ # (641 yield :Left_parenthesis_code, :Left_parenthesis_code642 when /\A\)/ # )643 yield :Right_parenthesis_code, :Right_parenthesis_code644 when /\A\$/ # $645 yield :Dollar_code, :Dollar_code646 when /\A\?\?/ # ??647 yield :SYM_DT_UNKNOWN, :SYM_DT_UNKNOWN648 when /\A\?/ # ?649 yield :Question_mark_code, :Question_mark_code650 when /\A\|/ # |651 @@logger.debug("#{__FILE__}:#{__LINE__}: scan_dadl: @in_interval = #{@in_interval} at #{@filename}:#{@lineno}")652 if @in_interval653 @in_interval = false654 else655 # @in_interval = false656 @in_interval = true657 end658 @@logger.debug("#{__FILE__}:#{__LINE__}: scan_dadl: SYM_INTERVAL_DELIM at #{@filename}:#{@lineno}")659 yield :SYM_INTERVAL_DELIM, :SYM_INTERVAL_DELIM660 ### when /\A\[[a-zA-Z0-9()\._-]+::[a-zA-Z0-9\._-]+\]/ #V_QUALIFIED_TERM_CODE_REF form [ICD10AM(1998)::F23]661 ### yield :V_QUALIFIED_TERM_CODE_REF, $&662 ### when /\A\[[a-zA-Z0-9][a-zA-Z0-9._\-]*\]/ #V_LOCAL_TERM_CODE_REF663 ### yield :V_LOCAL_TERM_CODE_REF, $&664 ### when /\A\[[a-zA-Z0-9._\- ]+::[a-zA-Z0-9._\- ]+\]/ #ERR_V_QUALIFIED_TERM_CODE_REF665 ### yield :ERR_V_QUALIFIED_TERM_CODE_REF, $&666 when /\A\[/ # [667 yield :Left_bracket_code, :Left_bracket_code668 when /\A\]/ # ]669 yield :Right_bracket_code, :Right_bracket_code670 ### when /\A[A-Z][a-zA-Z0-9_-]*/671 ### yield :V_TYPE_IDENTIFIER, $&672 ### when /\A[A-Z][a-zA-Z0-9_]*<[a-zA-Z0-9,_<>]+>/ #V_GENERIC_TYPE_IDENTIFIER673 ### yield :V_GENERIC_TYPE_IDENTIFIER, $&674 ### when /\A[a-z][a-zA-Z0-9_]*/675 ### word = $&.downcase676 ### if @@dadl_reserved[word]677 ### yield @@dadl_reserved[word], @@dadl_reserved[word]678 ### else679 ### yield :V_ATTRIBUTE_IDENTIFIER, $&680 ### end681 ### when /\Aa[ct][0-9.]+/ #V_LOCAL_CODE682 ### yield :V_LOCAL_CODE, $&683 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-]-684 yield :V_ISO8601_EXTENDED_DATE_TIME, $&685 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]686 yield :V_ISO8601_EXTENDED_TIME, $&687 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-DD688 yield :V_ISO8601_EXTENDED_DATE, $&689 when /\A[A-Z][a-zA-Z0-9_]*<[a-zA-Z0-9,_<>]+>/ #V_GENERIC_TYPE_IDENTIFIER690 yield :V_GENERIC_TYPE_IDENTIFIER, $&691 when /\A[0-9]+|[0-9]+[eE][+-]?[0-9]+/ #V_INTEGER692 yield :V_INTEGER, $&693 ### when /\A[0-9]+\.[0-9]+|[0-9]+\.[0-9]+[eE][+-]?[0-9]+ / #V_REAL694 ### yield :V_REAL, $&695 # when /\A"((?:[^"\\]+|\\.)*)"/ #V_STRING696 ### when /\A"([^"]*)"/m #V_STRING697 ### yield :V_STRING, $1698 when /\A[a-z]+:\/\/[^<>|\\{}^~"\[\] ]*/ #V_URI699 yield :V_URI, $&700 ### 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 PnYnMnWnDTnnHnnMnnS701 ### yield :V_ISO8601_DURATION, $&702 when /\A\S/ #UTF8CHAR703 yield :UTF8CHAR, $&704 end705 data = $' # variable $' receives the string after the match706 when :adl707 data = scan_adl(data) do |sym, val|708 yield sym, val709 end710 when :cadl711 data = scan_cadl(data) do |sym, val|712 yield sym, val713 end714 when :regexp715 # puts "Entering scan_regexp"716 data = scan_regexp(data) do |sym, val|717 yield sym, val718 end719 when :term_constraint720 @@logger.debug("#{__FILE__}:#{__LINE__}: scan_dadl: Entering scan_term_constraint at #{@filename}:#{@lineno}: data = #{data.inspect}")721 722 data = scan_term_constraint(data) do |sym, val|723 yield sym, val724 end725 else726 raise727 end728 end729 end # of scan_dadl730 731 def scan_regexp(data)732 @@logger.debug("#{__FILE__}:#{__LINE__}: Entering scan_regexp at #{@filename}:#{@lineno}: data = #{data.inspect}")733 until data.nil? do734 case @adl_type.last735 when :regexp736 case data737 when /\A\/\}/ #V_REGEXP738 if @adl_type.last == :regexp739 @in_regexp = false740 @adl_type.pop741 yield :END_REGEXP_BLOCK, :END_REGEXP_BLOCK742 else743 raise744 end745 when /\A(.*)(\/\})/ #V_REGEXP746 yield :REGEXP_BODY, $1747 if @adl_type.last == :regexp748 @in_regexp = false749 @adl_type.pop750 yield :END_REGEXP_BLOCK, :END_REGEXP_BLOCK751 else752 raise753 end754 else755 raise data756 end757 data = $' # variable $' receives the string after the match758 when :adl759 data = scan_adl(data) do |sym, val|760 yield sym, val761 end762 when :dadl763 data = scan_dadl(data) do |sym, val|764 yield sym, val765 end766 when :cadl767 data = scan_cadl(data) do |sym, val|768 yield sym, val769 end770 when :term_constraint771 @@logger.debug("#{__FILE__}:#{__LINE__}: scan_regexp: Entering scan_term_constraint at #{@filename}:#{@lineno}")772 data = scan_term_constraint(data) do |sym, val|773 yield sym, val774 end775 else776 raise777 end778 end779 end # of scan_regexp780 781 def scan_term_constraint(data)782 @@logger.debug("#{__FILE__}:#{__LINE__}: Entering scan_term_constraint")783 until data.nil? do784 case @adl_type.last785 when :term_constraint786 case data787 when /\A\n/ # carriage return788 @lineno += 1789 ;790 when /\A[ \t\r\f]+/ #just drop it791 ;792 when /\A--.*$/ # single line comment793 @lineno += 1794 #@@logger.debug("#{__FILE__}:#{__LINE__}: scan_term_constraint: COMMENT = #{$&} at #{@filename}:#{@lineno}")795 ;796 when /\A([a-zA-Z0-9\._\-])+[ \t]*,/ # match any line, with ',' termination797 yield :TERM_CODE, $1798 when /\A([a-zA-Z0-9\._\-])+[ \t]*;/ # match second last line with ';' termination (assumed value)799 yield :TERM_CODE, $1800 when /\A([a-zA-Z0-9\._\-])*[ \t]*\]/ # match final line, terminating in ']'801 adl_type = @adl_type.pop802 assert_at(__FILE__,__LINE__){adl_type == :term_constraint}803 yield :END_TERM_CODE_CONSTRAINT, $1804 else805 raise "data = #{data}"806 end807 data = $' # variable $' receives the string after the match808 when :adl809 data = scan_adl(data) do |sym, val|810 yield sym, val811 end812 when :dadl813 data = scan_dadl(data) do |sym, val|814 yield sym, val815 end816 when :cadl817 data = scan_cadl(data) do |sym, val|818 yield sym, val819 end820 else821 raise822 end823 end824 end # of scan_term_constraint825 115 826 116 … … 843 133 844 134 845 135 __END__ 846 136 847 137 … … 1518 808 3, 189, :_reduce_none, 1519 809 3, 189, :_reduce_none, 1520 1, 180, :_reduce_ none,810 1, 180, :_reduce_191, 1521 811 3, 190, :_reduce_none, 1522 812 3, 190, :_reduce_none, … … 2090 1380 archetype.original_language = language 2091 1381 end 2092 @@logger.debug("#{__FILE__}:#{__LINE__}: archetype = #{archetype } at #{@filename}:#{@lineno}")1382 @@logger.debug("#{__FILE__}:#{__LINE__}: archetype = #{archetype.to_yaml} at #{@filename}:#{@lineno}") 2093 1383 result = archetype 2094 1384 … … 2774 2064 module_eval(<<'.,.,', 'parser.y', 531) 2775 2065 def _reduce_103(val, _values, result) 2776 @@logger.debug("SYM_START_DBLOCK: #{val[0]} at #{@filename}:#{@lineno}") 2777 result = val[0] 2778 2779 result 2780 end 2781 .,., 2782 2783 module_eval(<<'.,.,', 'parser.y', 537) 2066 result = val[0] 2067 2068 result 2069 end 2070 .,., 2071 2072 module_eval(<<'.,.,', 'parser.y', 536) 2784 2073 def _reduce_104(val, _values, result) 2785 2074 result = Array[val[0]] … … 2789 2078 .,., 2790 2079 2791 module_eval(<<'.,.,', 'parser.y', 54 1)2080 module_eval(<<'.,.,', 'parser.y', 540) 2792 2081 def _reduce_105(val, _values, result) 2793 2082 result = (val[0] << val[1]) … … 2797 2086 .,., 2798 2087 2799 module_eval(<<'.,.,', 'parser.y', 54 6)2088 module_eval(<<'.,.,', 'parser.y', 545) 2800 2089 def _reduce_106(val, _values, result) 2801 2090 @@logger.debug("#{__FILE__}:#{__LINE__}: keyed_object = #{val[0]} at #{@filename}:#{@lineno}") 2802 result = {:object_key => val[0], :object_block => val[ 1]}2803 2804 result 2805 end 2806 .,., 2807 2808 module_eval(<<'.,.,', 'parser.y', 55 2)2091 result = {:object_key => val[0], :object_block => val[2]} 2092 2093 result 2094 end 2095 .,., 2096 2097 module_eval(<<'.,.,', 'parser.y', 551) 2809 2098 def _reduce_107(val, _values, result) 2810 2099 @@logger.debug("object_key: [#{val[1]}] at #{@filename}:#{@lineno}") … … 2815 2104 .,., 2816 2105 2817 module_eval(<<'.,.,', 'parser.y', 55 8)2106 module_eval(<<'.,.,', 'parser.y', 557) 2818 2107 def _reduce_108(val, _values, result) 2819 2108 result = {:untyped_single_attr_object_block => val[0]} … … 2823 2112 .,., 2824 2113 2825 module_eval(<<'.,.,', 'parser.y', 56 2)2114 module_eval(<<'.,.,', 'parser.y', 561) 2826 2115 def _reduce_109(val, _values, result) 2827 2116 result = {:type_identifier => val[0], :untyped_single_attr_object_block => val[1]} … … 2831 2120 .,., 2832 2121 2833 module_eval(<<'.,.,', 'parser.y', 56 7)2122 module_eval(<<'.,.,', 'parser.y', 566) 2834 2123 def _reduce_110(val, _values, result) 2835 2124 @@logger.debug("#{__FILE__}:#{__LINE__}: single_attr_object_complex_head = #{val[0]} at #{@filename}:#{@lineno}") … … 2840 2129 .,., 2841 2130 2842 module_eval(<<'.,.,', 'parser.y', 57 2)2131 module_eval(<<'.,.,', 'parser.y', 571) 2843 2132 def _reduce_111(val, _values, result) 2844 2133 @@logger.debug("#{__FILE__}:#{__LINE__}: attr_vals = #{val[1]} at #{@filename}:#{@lineno}") … … 2851 2140 # reduce 112 omitted 2852 2141 2853 module_eval(<<'.,.,', 'parser.y', 57 8)2142 module_eval(<<'.,.,', 'parser.y', 577) 2854 2143 def _reduce_113(val, _values, result) 2855 2144 @@logger.debug("#{__FILE__}:#{__LINE__}: untyped_primitive_object_block = #{val[0]} at #{@filename}:#{@lineno}") … … 2860 2149 .,., 2861 2150 2862 module_eval(<<'.,.,', 'parser.y', 58 3)2151 module_eval(<<'.,.,', 'parser.y', 582) 2863 2152 def _reduce_114(val, _values, result) 2864 2153 @@logger.debug("#{__FILE__}:#{__LINE__}: type_identifier = #{val[0]}, untyped_primitive_object_block = #{val[1]} at #{@filename}:#{@lineno}") … … 2869 2158 .,., 2870 2159 2871 module_eval(<<'.,.,', 'parser.y', 58 8)2160 module_eval(<<'.,.,', 'parser.y', 587) 2872 2161 def _reduce_115(val, _values, result) 2873 2162 @@logger.debug("#{__FILE__}:#{__LINE__}: primitive_object_block = <#{val[1]}> at #{@filename}:#{@lineno}") … … 2878 2167 .,., 2879 2168 2880 module_eval(<<'.,.,', 'parser.y', 59 3)2169 module_eval(<<'.,.,', 'parser.y', 592) 2881 2170 def _reduce_116(val, _values, result) 2882 2171 result = val[0] … … 2886 2175 .,., 2887 2176 2888 module_eval(<<'.,.,', 'parser.y', 59 7)2177 module_eval(<<'.,.,', 'parser.y', 596) 2889 2178 def _reduce_117(val, _values, result) 2890 2179 result = val[0] … … 2894 2183 .,., 2895 2184 2896 module_eval(<<'.,.,', 'parser.y', 60 1)2185 module_eval(<<'.,.,', 'parser.y', 600) 2897 2186 def _reduce_118(val, _values, result) 2898 2187 result = val[0] … … 2902 2191 .,., 2903 2192 2904 module_eval(<<'.,.,', 'parser.y', 60 5)2193 module_eval(<<'.,.,', 'parser.y', 604) 2905 2194 def _reduce_119(val, _values, result) 2906 2195 result = val[0] … … 2910 2199 .,., 2911 2200 2912 module_eval(<<'.,.,', 'parser.y', 60 9)2201 module_eval(<<'.,.,', 'parser.y', 608) 2913 2202 def _reduce_120(val, _values, result) 2914 2203 result = val[0] … … 2918 2207 .,., 2919 2208 2920 module_eval(<<'.,.,', 'parser.y', 61 3)2209 module_eval(<<'.,.,', 'parser.y', 612) 2921 2210 def _reduce_121(val, _values, result) 2922 2211 @@logger.debug("string_value: #{val[0]} at #{@filename}:#{@lineno}") … … 2927 2216 .,., 2928 2217 2929 module_eval(<<'.,.,', 'parser.y', 61 8)2218 module_eval(<<'.,.,', 'parser.y', 617) 2930 2219 def _reduce_122(val, _values, result) 2931 2220 @@logger.debug("integer_value: #{val[0]} at #{@filename}:#{@lineno}") … … 2936 2225 .,., 2937 2226 2938 module_eval(<<'.,.,', 'parser.y', 62 3)2227 module_eval(<<'.,.,', 'parser.y', 622) 2939 2228 def _reduce_123(val, _values, result) 2940 2229 @@logger.debug("real_value: #{val[0]} at #{@filename}:#{@lineno}") … … 2945 2234 .,., 2946 2235 2947 module_eval(<<'.,.,', 'parser.y', 62 8)2236 module_eval(<<'.,.,', 'parser.y', 627) 2948 2237 def _reduce_124(val, _values, result) 2949 2238 @@logger.debug("boolean_value: #{val[0]} at #{@filename}:#{@lineno}") … … 2954 2243 .,., 2955 2244 2956 module_eval(<<'.,.,', 'parser.y', 63 3)2245 module_eval(<<'.,.,', 'parser.y', 632) 2957 2246 def _reduce_125(val, _values, result) 2958 2247 @@logger.debug("character_value: #{val[0]} at #{@filename}:#{@lineno}") … … 2963 2252 .,., 2964 2253 2965 module_eval(<<'.,.,', 'parser.y', 63 8)2254 module_eval(<<'.,.,', 'parser.y', 637) 2966 2255 def _reduce_126(val, _values, result) 2967 2256 @@logger.debug("date_value: #{val[0]} at #{@filename}:#{@lineno}") … … 2972 2261 .,., 2973 2262 2974 module_eval(<<'.,.,', 'parser.y', 64 3)2263 module_eval(<<'.,.,', 'parser.y', 642) 2975 2264 def _reduce_127(val, _values, result) 2976 2265 @@logger.debug("time_value: #{val[0]} at #{@filename}:#{@lineno}") … … 2981 2270 .,., 2982 2271 2983 module_eval(<<'.,.,', 'parser.y', 64 8)2272 module_eval(<<'.,.,', 'parser.y', 647) 2984 2273 def _reduce_128(val, _values, result) 2985 2274 @@logger.debug("date_time_value: #{val[0]} at #{@filename}:#{@lineno}") … … 2990 2279 .,., 2991 2280 2992 module_eval(<<'.,.,', 'parser.y', 65 3)2281 module_eval(<<'.,.,', 'parser.y', 652) 2993 2282 def _reduce_129(val, _values, result) 2994 2283 @@logger.debug("duration_value: #{val[0]} at #{@filename}:#{@lineno}") … … 2999 2288 .,., 3000 2289 3001 module_eval(<<'.,.,', 'parser.y', 65 8)2290 module_eval(<<'.,.,', 'parser.y', 657) 3002 2291 def _reduce_130(val, _values, result) 3003 2292 @@logger.debug("uri_value: #{val[0]} at #{@filename}:#{@lineno}") … … 3038 2327 # reduce 145 omitted 3039 2328 3040 module_eval(<<'.,.,', 'parser.y', 68 1)2329 module_eval(<<'.,.,', 'parser.y', 680) 3041 2330 def _reduce_146(val, _values, result) 3042 2331 @@logger.debug("V_TYPE_IDENTIFIER: #{val[0]} at #{@filename}:#{@lineno}") … … 3047 2336 .,., 3048 2337 3049 module_eval(<<'.,.,', 'parser.y', 68 6)2338 module_eval(<<'.,.,', 'parser.y', 685) 3050 2339 def _reduce_147(val, _values, result) 3051 2340 @@logger.debug("V_GENERIC_TYPE_IDENTIFIER: #{val[0]} at #{@filename}:#{@lineno}") … … 3056 2345 .,., 3057 2346 3058 module_eval(<<'.,.,', 'parser.y', 69 2)2347 module_eval(<<'.,.,', 'parser.y', 691) 3059 2348 def _reduce_148(val, _values, result) 3060 2349 @@logger.debug("V_STRING: #{val[0]} at #{@filename}:#{@lineno}") … … 3071 2360 # reduce 151 omitted 3072 2361 3073 module_eval(<<'.,.,', 'parser.y', 70 2)2362 module_eval(<<'.,.,', 'parser.y', 701) 3074 2363 def _reduce_152(val, _values, result) 3075 2364 begin … … 3084 2373 .,., 3085 2374 3086 module_eval(<<'.,.,', 'parser.y', 71 1)2375 module_eval(<<'.,.,', 'parser.y', 710) 3087 2376 def _reduce_153(val, _values, result) 3088 2377 begin … … 3097 2386 .,., 3098 2387 3099 module_eval(<<'.,.,', 'parser.y', 7 20)2388 module_eval(<<'.,.,', 'parser.y', 719) 3100 2389 def _reduce_154(val, _values, result) 3101 2390 begin … … 3134 2423 # reduce 166 omitted 3135 2424 3136 module_eval(<<'.,.,', 'parser.y', 74 6)2425 module_eval(<<'.,.,', 'parser.y', 745) 3137 2426 def _reduce_167(val, _values, result) 3138 2427 begin … … 3147 2436 .,., 3148 2437 3149 module_eval(<<'.,.,', 'parser.y', 75 5)2438 module_eval(<<'.,.,', 'parser.y', 754) 3150 2439 def _reduce_168(val, _values, result) 3151 2440 begin … … 3160 2449 .,., 3161 2450 3162 module_eval(<<'.,.,', 'parser.y', 76 4)2451 module_eval(<<'.,.,', 'parser.y', 763) 3163 2452 def _reduce_169(val, _values, result) 3164 2453 begin … … 3197 2486 # reduce 181 omitted 3198 2487 3199 module_eval(<<'.,.,', 'parser.y', 78 9)2488 module_eval(<<'.,.,', 'parser.y', 788) 3200 2489 def _reduce_182(val, _values, result) 3201 2490 result = true … … 3205 2494 .,., 3206 2495 3207 module_eval(<<'.,.,', 'parser.y', 79 3)2496 module_eval(<<'.,.,', 'parser.y', 792) 3208 2497 def _reduce_183(val, _values, result) 3209 2498 result = false … … 3227 2516 # reduce 190 omitted 3228 2517 3229 # reduce 191 omitted 2518 module_eval(<<'.,.,', 'parser.y', 807) 2519 def _reduce_191(val, _values, result) 2520 result = val[0] 2521 2522 result 2523 end 2524 .,., 3230 2525 3231 2526 # reduce 192 omitted … … 3305 2600 # reduce 229 omitted 3306 2601 3307 module_eval(<<'.,.,', 'parser.y', 85 6)2602 module_eval(<<'.,.,', 'parser.y', 858) 3308 2603 def _reduce_230(val, _values, result) 3309 2604 @@logger.debug("V_ISO8601_DURATION: #{val[0]} at #{@filename}:#{@lineno}") … … 3338 2633 # reduce 242 omitted 3339 2634 3340 module_eval(<<'.,.,', 'parser.y', 87 6)2635 module_eval(<<'.,.,', 'parser.y', 878) 3341 2636 def _reduce_243(val, _values, result) 3342 2637 @@logger.debug("#{__FILE__}:#{__LINE__}: V_QUALIFIED_TERM_CODE_REF = #{val[0]} at #{@filename}:#{@lineno}") … … 3353 2648 # reduce 246 omitted 3354 2649 3355 module_eval(<<'.,.,', 'parser.y', 88 6)2650 module_eval(<<'.,.,', 'parser.y', 888) 3356 2651 def _reduce_247(val, _values, result) 3357 2652 @@logger.debug("#{__FILE__}:#{__LINE__}: V_URI = #{val[0]} at #{@filename}:#{@lineno}") … … 3442 2737 # reduce 287 omitted 3443 2738 3444 module_eval(<<'.,.,', 'parser.y', 95 6)2739 module_eval(<<'.,.,', 'parser.y', 958) 3445 2740 def _reduce_288(val, _values, result) 3446 2741 @@logger.debug("#{__FILE__}:#{__LINE__}, V_ATTRIBUTE_IDENTIFIER = #{val[0]} at #{@filename}") … … 3450 2745 .,., 3451 2746 3452 module_eval(<<'.,.,', 'parser.y', 96 0)2747 module_eval(<<'.,.,', 'parser.y', 962) 3453 2748 def _reduce_289(val, _values, result) 3454 2749 @@logger.debug("#{__FILE__}:#{__LINE__}, V_ATTRIBUTE_IDENTIFIER = #{val[0]} at #{@filename}") … … 3458 2753 .,., 3459 2754 3460 module_eval(<<'.,.,', 'parser.y', 97 1)2755 module_eval(<<'.,.,', 'parser.y', 973) 3461 2756 def _reduce_290(val, _values, result) 3462 2757 result = Range.new(1,1) … … 3466 2761 .,., 3467 2762 3468 module_eval(<<'.,.,', 'parser.y', 97 5)2763 module_eval(<<'.,.,', 'parser.y', 977) 3469 2764 def _reduce_291(val, _values, result) 3470 2765 result = val[3] … … 3474 2769 .,., 3475 2770 3476 module_eval(<<'.,.,', 'parser.y', 98 0)2771 module_eval(<<'.,.,', 'parser.y', 982) 3477 2772 def _reduce_292(val, _values, result) 3478 2773 begin … … 3487 2782 .,., 3488 2783 3489 module_eval(<<'.,.,', 'parser.y', 9 89)2784 module_eval(<<'.,.,', 'parser.y', 991) 3490 2785 def _reduce_293(val, _values, result) 3491 2786 begin … … 3501 2796 .,., 3502 2797 3503 module_eval(<<'.,.,', 'parser.y', 100 0)2798 module_eval(<<'.,.,', 'parser.y', 1002) 3504 2799 def _reduce_294(val, _values, result) 3505 2800 result = OpenEHR::AM::Archetype::Constraint_Model::CARDINALITY.new … … 3525 2820 # reduce 302 omitted 3526 2821 3527 module_eval(<<'.,.,', 'parser.y', 101 4)2822 module_eval(<<'.,.,', 'parser.y', 1016) 3528 2823 def _reduce_303(val, _values, result) 3529 2824 result = val[0] … … 3533 2828 .,., 3534 2829 3535 module_eval(<<'.,.,', 'parser.y', 10 18)2830 module_eval(<<'.,.,', 'parser.y', 1020) 3536 2831 def _reduce_304(val, _values, result) 3537 2832 result = val[0] … … 3543 2838 # reduce 305 omitted 3544 2839 3545 module_eval(<<'.,.,', 'parser.y', 102 5)2840 module_eval(<<'.,.,', 'parser.y', 1027) 3546 2841 def _reduce_306(val, _values, result) 3547 2842 result = val[3] … … 3643 2938 # reduce 352 omitted 3644 2939 3645 module_eval(<<'.,.,', 'parser.y', 109 5)2940 module_eval(<<'.,.,', 'parser.y', 1097) 3646 2941 def _reduce_353(val, _values, result) 3647 2942 result = OpenEHR::AM::Archetype::Constraint_Model::Primitive::C_BOOLEAN.new(:true_valid => true) … … 3651 2946 .,., 3652 2947 3653 module_eval(<<'.,.,', 'parser.y', 1 099)2948 module_eval(<<'.,.,', 'parser.y', 1101) 3654 2949 def _reduce_354(val, _values, result) 3655 2950 result = OpenEHR::AM::Archetype::Constraint_Model::Primitive::C_BOOLEAN.new(:true_valid => false) … … 3659 2954 .,., 3660 2955 3661 module_eval(<<'.,.,', 'parser.y', 110 3)2956 module_eval(<<'.,.,', 'parser.y', 1105) 3662 2957 def _reduce_355(val, _values, result) 3663 2958 result = OpenEHR::AM::Archetype::Constraint_Model::Primitive::C_BOOLEAN.new(:true_valid => true,:false_valid => false) … … 3667 2962 .,., 3668 2963 3669 module_eval(<<'.,.,', 'parser.y', 110 7)2964 module_eval(<<'.,.,', 'parser.y', 1109) 3670 2965 def _reduce_356(val, _values, result) 3671 2966 result = OpenEHR::AM::Archetype::Constraint_Model::Primitive::C_BOOLEAN.new(:true_valid => false,:false_valid => true) … … 3675 2970 .,., 3676 2971 3677 module_eval(<<'.,.,', 'parser.y', 111 2)2972 module_eval(<<'.,.,', 'parser.y', 1114) 3678 2973 def _reduce_357(val, _values, result) 3679 2974 result = val[0] … … 3683 2978 .,., 3684 2979 3685 module_eval(<<'.,.,', 'parser.y', 111 6)2980 module_eval(<<'.,.,', 'parser.y', 1118) 3686 2981 def _reduce_358(val, _values, result) 3687 2982 raise 'Not implemented yet' … … 3691 2986 .,., 3692 2987 3693 module_eval(<<'.,.,', 'parser.y', 112 0)2988 module_eval(<<'.,.,', 'parser.y', 1122) 3694 2989 def _reduce_359(val, _values, result) 3695 2990 raise 'Not implemented yet' … … 3709 3004 # reduce 364 omitted 3710 3005 3711 module_eval(<<'.,.,', 'parser.y', 113 2)3006 module_eval(<<'.,.,', 'parser.y', 1134) 3712 3007 def _reduce_365(val, _values, result) 3713 3008 @in_interval = false … … 3718 3013 .,., 3719 3014 3720 module_eval(<<'.,.,', 'parser.y', 11 39)3015 module_eval(<<'.,.,', 'parser.y', 1141) 3721 3016 def _reduce_366(val, _values, result) 3722 3017 result = val[0] … … 3726 3021 .,., 3727 3022 3728 module_eval(<<'.,.,', 'parser.y', 114 3)3023 module_eval(<<'.,.,', 'parser.y', 1145) 3729 3024 def _reduce_367(val, _values, result) 3730 3025 result = val[0] … … 3734 3029 .,., 3735 3030 3736 module_eval(<<'.,.,', 'parser.y', 11 49)3031 module_eval(<<'.,.,', 'parser.y', 1151) 3737 3032 def _reduce_368(val, _values, result) 3738 3033 @@logger.debug("#{__FILE__}:#{__LINE__}, START_TERM_CODE_CONSTRAINT = #{val[0]} at #{@filename}") … … 3751 3046 # reduce 371 omitted 3752 3047 3753 module_eval(<<'.,.,', 'parser.y', 116 5)3048 module_eval(<<'.,.,', 'parser.y', 1167) 3754 3049 def _reduce_372(val, _values, result) 3755 3050 result = val[0] … … 3759 3054 .,., 3760 3055 3761 module_eval(<<'.,.,', 'parser.y', 117 0)3056 module_eval(<<'.,.,', 'parser.y', 1172) 3762 3057 def _reduce_373(val, _values, result) 3763 3058 result = val[0] … … 3767 3062 .,., 3768 3063 3769 module_eval(<<'.,.,', 'parser.y', 117 4)3064 module_eval(<<'.,.,', 'parser.y', 1176) 3770 3065 def _reduce_374(val, _values, result) 3771 3066 @@logger.debug("#{__FILE__}:#{__LINE__}, V_ATTRIBUTE_IDENTIFIER = #{word} at #{@filename}") … … 3776 3071 .,., 3777 3072 3778 module_eval(<<'.,.,', 'parser.y', 118 5)3073 module_eval(<<'.,.,', 'parser.y', 1187) 3779 3074 def _reduce_375(val, _values, result) 3780 3075 result = val[0] -
ruby/trunk/lib/adl_parser/lib/parser.y
r265 r283 55 55 archetype.original_language = language 56 56 end 57 @@logger.debug("#{__FILE__}:#{__LINE__}: archetype = #{archetype } at #{@filename}:#{@lineno}")57 @@logger.debug("#{__FILE__}:#{__LINE__}: archetype = #{archetype.to_yaml} at #{@filename}:#{@lineno}") 58 58 result = archetype 59 59 } … … 530 530 multiple_attr_object_block_head: SYM_START_DBLOCK 531 531 { 532 @@logger.debug("SYM_START_DBLOCK: #{val[0]} at #{@filename}:#{@lineno}")533 532 result = val[0] 534 533 } … … 546 545 { 547 546 @@logger.debug("#{__FILE__}:#{__LINE__}: keyed_object = #{val[0]} at #{@filename}:#{@lineno}") 548 result = {:object_key => val[0], :object_block => val[ 1]}547 result = {:object_key => val[0], :object_block => val[2]} 549 548 } 550 549 … … 806 805 807 806 date_value: V_ISO8601_EXTENDED_DATE 807 { 808 result = val[0] 809 } 808 810 809 811 date_list_value: date_value Comma_code date_value … … 1194 1196 $:.unshift File.join(File.dirname(__FILE__)) 1195 1197 require 'logger' 1198 require 'yaml' 1196 1199 require 'rubygems' 1197 1200 require 'adl_parser.rb' 1198 1201 require 'am.rb' 1199 1202 require 'rm.rb' 1200 $DEBUG = true1203 $DEBUG = false 1201 1204 1202 1205 … … 1218 1221 end 1219 1222 1220 @@dadl_scanner = OpenEHR::ADL::Scanner::DADL::RootScanner.new1221 @@cadl_scanner = OpenEHR::ADL::Scanner::CADL::RootScanner.new1222 1223 1223 1224 ###----------/* keywords */ --------------------------------------------- … … 1282 1283 def scan 1283 1284 @@logger.debug("#{__FILE__}:#{__LINE__}: Entering scan at #{@filename}:#{@lineno}:") 1284 adl_scanner = OpenEHR::ADL::Scanner::ADLScanner.new(@adl_type, @filename) 1285 cadl_scanner = OpenEHR::ADL::Scanner::CADLScanner.new(@adl_type, @filename) 1286 dadl_scanner = OpenEHR::ADL::Scanner::DADLScanner.new(@adl_type, @filename) 1287 regex_scanner = OpenEHR::ADL::Scanner::RegexScanner.new(@adl_type, @filename) 1288 term_constraint_scanner = OpenEHR::ADL::Scanner::TermConstraintScanner.new(@adl_type, @filename) 1285 scanner = OpenEHR::ADL::Scanner::ADLScanner.new(@adl_type, @filename) 1289 1286 1290 1287 until @data.nil? do 1291 case @adl_type.last 1292 when :adl 1293 @data = adl_scanner.scan(@data) do |sym, val| 1288 @data = scanner.scan(@data) do |sym, val| 1294 1289 yield sym, val 1295 end1296 when :dadl1297 @data = dadl_scanner.scan(@data) do |sym, val|1298 yield sym, val1299 end1300 when :cadl1301 @data = cadl_scanner.scan(@data) do |sym, val|1302 yield sym, val1303 end1304 when :regexp1305 @data = regex_scanner.scan(@data) do |sym, val|1306 yield sym, val1307 end1308 when :term_constraint1309 @@logger.debug("#{__FILE__}:#{__LINE__}: scan: Entering scan_term_constraint at #{@filename}:#{@lineno}: data = #{@data.inspect}")1310 @data = term_constraint_scanner.scan(@data) do |sym, val|1311 yield sym, val1312 end1313 else1314 raise1315 1290 end 1316 1291 @data = $' # variable $' receives the string after the match … … 1319 1294 yield false, '$' 1320 1295 end # of scan 1321 1322 ### def scan1323 ### @@logger.debug("#{__FILE__}:#{__LINE__}: Entering scan at #{@filename}:#{@lineno}:")1324 1325 ### until @data.nil? do1326 ### case @adl_type.last1327 ### when :adl1328 ### @data = scan_adl(@data) do |sym, val|1329 ### yield sym, val1330 ### end1331 ### when :dadl1332 ### @data = scan_dadl(@data) do |sym, val|1333 ### yield sym, val1334 ### end1335 ### when :cadl1336 ### @data = scan_cadl(@data) do |sym, val|1337 ### yield sym, val1338 ### end1339 ### when :regexp1340 ### @data = scan_regexp(@data) do |sym, val|1341 ### yield sym, val1342 ### end1343 ### when :term_constraint1344 ### @@logger.debug("#{__FILE__}:#{__LINE__}: scan: Entering scan_term_constraint at #{@filename}:#{@lineno}: data = #{data.inspect}")1345 ### @data = scan_term_constraint(@data) do |sym, val|1346 ### yield sym, val1347 ### end1348 ### else1349 ### raise1350 ### end1351 ### @data = $' # variable $' receives the string after the match1352 ### end1353 ### yield :EOF, nil1354 ### yield false, '$'1355 ### end # of scan1356 1357 def scan_adl(data)1358 @@logger.debug("#{__FILE__}:#{__LINE__}: Entering scan_adl at #{@filename}:#{@lineno}: data = #{data.inspect}")1359 until data.nil? do1360 case @adl_type.last1361 when :adl1362 case data1363 when /\A\n/ # carriage return1364 @lineno += 11365 ;1366 when /\A[ \t\r\f]+/ #just drop it1367 ;1368 when /\A--.*\n/ # single line comment1369 @lineno += 11370 @@logger.debug("#{__FILE__}:#{__LINE__}: scan_adl: COMMENT = #{$&} at #{@filename}:#{@lineno}")1371 ;1372 when /\Adescription/ # description1373 yield :SYM_DESCRIPTION, :SYM_DESCRIPTION1374 when /\Adefinition/ # definition1375 yield :SYM_DEFINITION, :SYM_DEFINITION1376 ###----------/* symbols */ -------------------------------------------------1377 when /\A[A-Z][a-zA-Z0-9_]*/1378 yield :V_TYPE_IDENTIFIER, $&1379 # when /\A[a-zA-Z][a-zA-Z0-9_-]+\.[a-zA-Z][a-zA-Z0-9_-]+\.[a-zA-Z0-9]+/ #V_ARCHETYPE_ID1380 when /\A(\w+)-(\w+)-(\w+)\.(\w+)(-\w+)?\.(v\w+)/ #V_ARCHETYPE_ID1381 object_id, rm_originator, rm_name, rm_entity, concept_name, specialisation, version_id = $&, $1, $2, $3, $4, $5, $61382 archetype_id = OpenEHR::RM::Support::Identification::Archetype_ID.new(object_id, concept_name, rm_name, rm_entity, rm_originator, specialisation, version_id)1383 # yield :V_ARCHETYPE_ID, $&1384 yield :V_ARCHETYPE_ID, archetype_id1385 when /\A[a-z][a-zA-Z0-9_]*/1386 # word = $&.downcase1387 word = $&1388 if @@adl_reserved[word]1389 @@logger.debug("#{__FILE__}:#{__LINE__}: scan_adl: @@adl_reserved = #{@@adl_reserved[word]} at #{@filename}:#{@lineno}")1390 yield @@adl_reserved[word], @@adl_reserved[word]1391 elsif #/\A[A-Z][a-zA-Z0-9_]*/1392 @@logger.debug("#{__FILE__}:#{__LINE__}: scan_adl: V_ATTRIBUTE_IDENTIFIER = #{$&} at #{@filename}:#{@lineno}")1393 yield :V_ATTRIBUTE_IDENTIFIER, $&1394 end1395 when /\A\=/ # =1396 yield :SYM_EQ, :SYM_EQ1397 when /\A\>=/ # >=1398 yield :SYM_GE, :SYM_GE1399 when /\A\<=/ # <=1400 yield :SYM_LE, :SYM_LE1401 when /\A\</ # <1402 if @in_interval1403 # @start_block_received = false1404 yield :SYM_LT, :SYM_LT1405 else1406 # @start_block_received = true1407 @adl_type.push(:dadl)1408 yield :SYM_START_DBLOCK, $&1409 end1410 when /\A\>/ # >1411 if @in_interval1412 yield :SYM_GT, :SYM_GT1413 else1414 adl_type = @adl_type.pop1415 assert_at(__FILE__,__LINE__){adl_type == :dadl}1416 yield :SYM_END_DBLOCK, :SYM_END_DBLOCK1417 end1418 when /\A\{/ # {1419 @adl_type.push(:cadl)1420 @@logger.debug("#{__FILE__}:#{__LINE__}: scan_cadl: entering cADL at #{@filename}:#{@lineno}")1421 yield :SYM_START_CBLOCK, :SYM_START_CBLOCK1422 when /\A\}/ # }1423 adl_type = @adl_type.pop1424 # puts "Escaping #{adl_type}"1425 assert_at(__FILE__,__LINE__){adl_type == :cadl}1426 @@logger.debug("#{__FILE__}:#{__LINE__}: scan_cadl: exiting cADL at #{@filename}:#{@lineno}")1427 yield :SYM_END_CBLOCK, $&1428 when /\A\-/ # -1429 yield :Minus_code, :Minus_code1430 when /\A\+/ # +1431 yield :Plus_code, :Plus_code1432 when /\A\*/ # *1433 yield :Star_code, :Star_code1434 when /\A\// # /1435 yield :Slash_code, :Slash_code1436 when /\A\^/ # ^1437 yield :Caret_code, :Caret_code1438 when /\A\=/ # =1439 yield :Equal_code, :Equal_code1440 when /\A\.\.\./ # ...1441 yield :SYM_LIST_CONTINUE, :SYM_LIST_CONTINUE1442 when /\A\.\./ # ..1443 yield :SYM_ELLIPSIS, :SYM_ELLIPSIS1444 when /\A\./ # .1445 yield :Dot_code, :Dot_code1446 when /\A\;/ # ;1447 yield :Semicolon_code, :Semicolon_code1448 when /\A\,/ # ,1449 yield :Comma_code, :Comma_code1450 when /\A\:/ # :1451 yield :Colon_code, :Colon_code1452 when /\A\!/ # !1453 yield :Exclamation_code, :Exclamation_code1454 when /\A\(/ # (1455 yield :Left_parenthesis_code, :Left_parenthesis_code1456 when /\A\)/ # )1457 yield :Right_parenthesis_code, :Right_parenthesis_code1458 when /\A\$/ # $1459 yield :Dollar_code, :Dollar_code1460 when /\A\?\?/ # ??1461 yield :SYM_DT_UNKNOWN, :SYM_DT_UNKNOWN1462 when /\A\?/ # ?1463 yield :Question_mark_code, :Question_mark_code1464 when /\A[0-9]+\.[0-9]+(\.[0-9]+)*/ # ?1465 yield :V_VERSION_STRING, $&1466 when /\A\|/ # |1467 if @in_interval1468 @in_interval = false1469 else1470 @in_interval = true1471 end1472 yield :SYM_INTERVAL_DELIM, :SYM_INTERVAL_DELIM1473 when /\A\[[a-zA-Z0-9()\._-]+::[a-zA-Z0-9\._-]+\]/1474 # when /\A\[[a-zA-Z0-9()\._-]+\:\:[a-zA-Z0-9\._-]+\]/ #V_QUALIFIED_TERM_CODE_REF form [ICD10AM(1998)::F23]1475 yield :V_QUALIFIED_TERM_CODE_REF, $&1476 when /\A\[[a-zA-Z0-9][a-zA-Z0-9._\-]*\]/ #V_LOCAL_TERM_CODE_REF1477 yield :V_LOCAL_TERM_CODE_REF, $&1478 when /\A\[/ # [1479 yield :Left_bracket_code, :Left_bracket_code1480 when /\A\]/ # ]1481 yield :Right_bracket_code, :Right_bracket_code1482 1483 when /\A"([^"]*)"/m #V_STRING1484 yield :V_STRING, $11485 when /\A\[[a-zA-Z0-9._\- ]+::[a-zA-Z0-9._\- ]+\]/ #ERR_V_QUALIFIED_TERM_CODE_REF1486 yield :ERR_V_QUALIFIED_TERM_CODE_REF, $&1487 when /\Aa[ct][0-9.]+/ #V_LOCAL_CODE1488 yield :V_LOCAL_CODE, $&1489 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-]-1490 yield :V_ISO8601_EXTENDED_DATE_TIME, $&1491 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]1492 yield :V_ISO8601_EXTENDED_TIME, $&1493 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-DD1494 yield :V_ISO8601_EXTENDED_DATE, $&1495 when /\A[A-Z][a-zA-Z0-9_]*<[a-zA-Z0-9,_<>]+>/ #V_GENERIC_TYPE_IDENTIFIER1496 yield :V_GENERIC_TYPE_IDENTIFIER, $&1497 when /\A[0-9]+|[0-9]+[eE][+-]?[0-9]+/ #V_INTEGER1498 yield :V_INTEGER, $&1499 when /\A[0-9]+\.[0-9]+|[0-9]+\.[0-9]+[eE][+-]?[0-9]+ / #V_REAL1500 yield :V_REAL, $&1501 # when /\A"((?:[^"\\]+|\\.)*)"/ #V_STRING1502 when /\A[a-z]+:\/\/[^<>|\\{}^~"\[\] ]*/ #V_URI1503 yield :V_URI, $&1504 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 PnYnMnWnDTnnHnnMnnS1505 yield :V_ISO8601_DURATION, $&1506 when /\A\S/ #UTF8CHAR1507 yield :UTF8CHAR, $&1508 end1509 data = $' # variable $' receives the string after the match1510 when :dadl1511 data = scan_dadl(data) do |sym, val|1512 yield sym, val1513 end1514 when :cadl1515 data = scan_cadl(data) do |sym, val|1516 yield sym, val1517 end1518 when :regexp1519 data = scan_regexp(data) do |sym, val|1520 yield sym, val1521 end1522 when :term_constraint1523 @@logger.debug("#{__FILE__}:#{__LINE__}: scan_adl: Entering scan_term_constraint at #{@filename}:#{@lineno}: data = #{data.inspect}")1524 1525 data = scan_term_constraint(data) do |sym, val|1526 yield sym, val1527 end1528 else1529 raise1530 end1531 end1532 end # scan_adl1533 1534 1535 def scan_cadl(data)1536 @@logger.debug("#{__FILE__}:#{__LINE__}: Entering scan_cadl at #{@filename}:#{@lineno}: data = #{data.inspect}")1537 until data.nil? do1538 case @adl_type.last1539 when :cadl1540 case scanned = @@cadl_scanner.parse(data)1541 when Yaparc::Result::OK1542 if scanned.value[0] == :START_V_C_DOMAIN_TYPE_BLOCK1543 @in_c_domain_type = true1544 @adl_type.push(:dadl)1545 yield scanned.value1546 else1547 yield scanned.value1548 end1549 data = scanned.input1550 end1551 1552 case data1553 when /\A\n/ # carriage return1554 @lineno += 11555 ;1556 when /\A[ \t\r\f]+/ #just drop it1557 ;1558 when /\A--.*\n/ # single line comment1559 @lineno += 11560 @@logger.debug("#{__FILE__}:#{__LINE__}: scan_cadl: COMMENT = #{$&} at #{@filename}:#{@lineno}")1561 ;1562 ###----------/* symbols */ -------------------------------------------------1563 when /\A\=/ # =1564 yield :SYM_EQ, :SYM_EQ1565 when /\A\>=/ # >=1566 yield :SYM_GE, :SYM_GE1567 when /\A\<=/ # <=1568 yield :SYM_LE, :SYM_LE1569 ### when /\A[A-Z][a-zA-Z0-9_]*[ \n]*\</ # V_C_DOMAIN_TYPE1570 ### @in_c_domain_type = true1571 ### @adl_type.push(:dadl)1572 ### yield :START_V_C_DOMAIN_TYPE_BLOCK, $&1573 when /\A\</ # <1574 if @in_interval1575 yield :SYM_LT, :SYM_LT1576 else1577 @adl_type.push(:dadl)1578 yield :SYM_START_DBLOCK, $&1579 end1580 when /\A\>/ # >1581 if @in_interval1582 yield :SYM_GT, :SYM_GT1583 else1584 adl_type = @adl_type.pop1585 # puts "Escaping #{adl_type}"1586 assert_at(__FILE__,__LINE__){adl_type == :dadl}1587 yield :SYM_END_DBLOCK, :SYM_END_DBLOCK1588 end1589 when /\A\-/ # -1590 yield :Minus_code, :Minus_code1591 when /\A\+/ # +1592 yield :Plus_code, :Plus_code1593 when /\A\*/ # *1594 yield :Star_code, :Star_code1595 when /\A\// # /1596 yield :Slash_code, :Slash_code1597 when /\A\^/ # ^1598 yield :Caret_code, :Caret_code1599 when /\A\.\.\./ # ...1600 yield :SYM_LIST_CONTINUE, :SYM_LIST_CONTINUE1601 when /\A\.\./ # ..1602 yield :SYM_ELLIPSIS, :SYM_ELLIPSIS1603 when /\A\./ # .1604 yield :Dot_code, :Dot_code1605 when /\A\;/ # ;1606 yield :Semicolon_code, :Semicolon_code1607 when /\A\,/ # ,1608 yield :Comma_code, :Comma_code1609 when /\A\:/ # :1610 yield :Colon_code, :Colon_code1611 when /\A\!/ # !1612 yield :Exclamation_code, :Exclamation_code1613 when /\A\(/ # (1614 yield :Left_parenthesis_code, :Left_parenthesis_code1615 when /\A\)/ # )1616 yield :Right_parenthesis_code, :Right_parenthesis_code1617 when /\A\{\// #V_REGEXP1618 if @adl_type.last != :regexp1619 @in_regexp = true1620 @adl_type.push(:regexp)1621 yield :START_REGEXP_BLOCK, :START_REGEXP_BLOCK1622 else1623 raise1624 end1625 # yield :V_REGEXP, :V_REGEXP1626 when /\A\{/ # {1627 @adl_type.push(:cadl)1628 @@logger.debug("#{__FILE__}:#{__LINE__}: scan_cadl: entering cADL at #{@filename}:#{@lineno}")1629 yield :SYM_START_CBLOCK, :SYM_START_CBLOCK1630 when /\A\}/ # }1631 adl_type = @adl_type.pop1632 # puts "Escaping #{adl_type}"1633 assert_at(__FILE__,__LINE__){adl_type == :cadl}1634 @@logger.debug("#{__FILE__}:#{__LINE__}: scan_cadl: exiting cADL at #{@filename}:#{@lineno}")1635 yield :SYM_END_CBLOCK, :SYM_END_CBLOCK1636 when /\A\$/ # $1637 yield :Dollar_code, :Dollar_code1638 when /\A\?\?/ # ??1639 yield :SYM_DT_UNKNOWN, :SYM_DT_UNKNOWN1640 when /\A\?/ # ?1641 yield :Question_mark_code, :Question_mark_code1642 when /\A\|/ # |1643 @@logger.debug("#{__FILE__}:#{__LINE__}: scan_cadl: @in_interval = #{@in_interval} at #{@filename}:#{@lineno}")1644 if @in_interval1645 @in_interval = false1646 else1647 # @in_interval = false1648 @in_interval = true1649 end1650 @@logger.debug("#{__FILE__}:#{__LINE__}: scan_cadl: SYM_INTERVAL_DELIM at #{@filename}:#{@lineno}")1651 yield :SYM_INTERVAL_DELIM, :SYM_INTERVAL_DELIM1652 1653 when /\A\[[a-zA-Z0-9()\._-]+::[a-zA-Z0-9\._-]+\]/ #V_QUALIFIED_TERM_CODE_REF form [ICD10AM(1998)::F23]1654 # when /\A\[[a-zA-Z0-9._\-]+::[a-zA-Z0-9._\-]+\]/ #V_QUALIFIED_TERM_CODE_REF form [ICD10AM(1998)::F23]1655 yield :V_QUALIFIED_TERM_CODE_REF, $&1656 when /\A\[[a-zA-Z0-9._\- ]+::[a-zA-Z0-9._\- ]+\]/ #ERR_V_QUALIFIED_TERM_CODE_REF1657 yield :ERR_V_QUALIFIED_TERM_CODE_REF, $&1658 when /\A\[([a-zA-Z0-9\(\)\._\-]+)::[ \t\n]*/1659 @adl_type.push(:term_constraint)1660 yield :START_TERM_CODE_CONSTRAINT, $11661 when /\A\[[a-zA-Z0-9][a-zA-Z0-9._\-]*\]/ #V_LOCAL_TERM_CODE_REF1662 yield :V_LOCAL_TERM_CODE_REF, $&1663 when /\A\[/ # [1664 yield :Left_bracket_code, :Left_bracket_code1665 when /\A\]/ # ]1666 yield :Right_bracket_code, :Right_bracket_code1667 when /\A[A-Z][a-zA-Z0-9_]*<[a-zA-Z0-9,_<>]+>/ #V_GENERIC_TYPE_IDENTIFIER1668 yield :V_GENERIC_TYPE_IDENTIFIER, $&1669 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]/1670 yield :V_ISO8601_DATE_TIME_CONSTRAINT_PATTERN, $&1671 when /\A[yY][yY][yY][yY]-[mM?X][mM?X]-[dD?X][dD?X]/1672 yield :V_ISO8601_DATE_CONSTRAINT_PATTERN, $&1673 when /\A[hH][hH]:[mM?X][mM?X]:[sS?X][sS?X]/1674 yield :V_ISO8601_TIME_CONSTRAINT_PATTERN, $&1675 when /\A[a-z][a-zA-Z0-9_]*/1676 word = $&.dup1677 if @@cadl_reserved[word.downcase]1678 yield @@cadl_reserved[word.downcase], @@cadl_reserved[word.downcase]1679 else1680 @@logger.debug("#{__FILE__}:#{__LINE__}: scan_cadl: V_ATTRIBUTE_IDENTIFIER = #{word} at #{@filename}:#{@lineno}")1681 yield :V_ATTRIBUTE_IDENTIFIER, word #V_ATTRIBUTE_IDENTIFIER /\A[a-z][a-zA-Z0-9_]*/1682 end1683 when /\A[A-Z][a-zA-Z0-9_]*/1684 word = $&.dup1685 if @@cadl_reserved[word.downcase]1686 yield @@cadl_reserved[word.downcase], @@cadl_reserved[word.downcase]1687 else1688 yield :V_TYPE_IDENTIFIER, $&1689 end1690 when /\Aa[ct][0-9.]+/ #V_LOCAL_CODE1691 yield :V_LOCAL_CODE, $&1692 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-]-1693 yield :V_ISO8601_EXTENDED_DATE_TIME, $&1694 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]1695 yield :V_ISO8601_EXTENDED_TIME, $&1696 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-DD1697 yield :V_ISO8601_EXTENDED_DATE, $&1698 when /\A[0-9]+|[0-9]+[eE][+-]?[0-9]+/ #V_INTEGER1699 yield :V_INTEGER, $&1700 when /\A[0-9]+\.[0-9]+|[0-9]+\.[0-9]+[eE][+-]?[0-9]+ / #V_REAL1701 yield :V_REAL, $&1702 when /\A"((?:[^"\\]+|\\.)*)"/ #V_STRING1703 when /\A"([^"]*)"/m #V_STRING1704 yield :V_STRING, $11705 when /\A[a-z]+:\/\/[^<>|\\{}^~"\[\] ]*/ #V_URI1706 yield :V_URI, $&1707 ### 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 PnYnMnWnDTnnHnnMnnS1708 ### yield :V_ISO8601_DURATION, $&1709 when /\A\S/ #UTF8CHAR1710 yield :UTF8CHAR, $&1711 else1712 raise1713 end1714 data = $' # variable $' receives the string after the match1715 when :adl1716 data = scan_adl(data) do |sym, val|1717 yield sym, val1718 end1719 when :dadl1720 data = scan_dadl(data) do |sym, val|1721 yield sym, val1722 end1723 when :regexp1724 data = scan_regexp(data) do |sym, val|1725 yield sym, val1726 end1727 when :term_constraint1728 @@logger.debug("#{__FILE__}:#{__LINE__}: scan_cadl: Entering scan_term_constraint at #{@filename}:#{@lineno}: data = #{data.inspect}")1729 1730 data = scan_term_constraint(data) do |sym, val|1731 yield sym, val1732 end1733 else1734 raise1735 end1736 end # of until1737 end # of scan_cadl1738 1739 def scan_dadl(data)1740 @@logger.debug("#{__FILE__}:#{__LINE__}: Entering scan_dadl at #{@filename}:#{@lineno}: data = #{data.inspect}")1741 until data.nil? do1742 case @adl_type.last1743 when :dadl1744 case scanned = @@dadl_scanner.parse(data)1745 when Yaparc::Result::OK1746 yield scanned.value1747 data = scanned.input1748 else1749 end1750 1751 case data1752 when /\A\n/ # carriage return1753 @lineno += 11754 ;1755 when /\A[ \t\r\f]+/ #just drop it1756 ;1757 when /\A--.*\n/ # single line comment1758 @lineno += 11759 @@logger.debug("#{__FILE__}:#{__LINE__}: scan_dadl: COMMENT = #{$&} at #{@filename}:#{@lineno}")1760 ;1761 ###----------/* symbols */ -------------------------------------------------1762 when /\A\=/ # =1763 yield :SYM_EQ, :SYM_EQ1764 when /\A\>\=/ # >=1765 yield :SYM_GE, :SYM_GE1766 when /\A\<\=/ # <=1767 yield :SYM_LE, :SYM_LE1768 when /\A\</ # <1769 if @in_interval1770 yield :SYM_LT, :SYM_LT1771 else1772 @adl_type.push(:dadl)1773 yield :SYM_START_DBLOCK, :SYM_START_DBLOCK1774 end1775 when /\A\>/ # >1776 if @in_interval1777 # @in_interval = false1778 yield :SYM_GT, :SYM_GT1779 elsif @in_c_domain_type == true1780 assert_at(__FILE__,__LINE__){@adl_type.last == :dadl}1781 adl_type = @adl_type.pop1782 if @adl_type.last == :cadl1783 @in_c_domain_type = false1784 yield :END_V_C_DOMAIN_TYPE_BLOCK, $&1785 else1786 yield :SYM_END_DBLOCK, $&1787 end1788 elsif @in_c_domain_type == false1789 adl_type = @adl_type.pop1790 assert_at(__FILE__,__LINE__){adl_type == :dadl}1791 yield :SYM_END_DBLOCK, $&1792 else1793 raise1794 end1795 when /\A\-/ # -1796 yield :Minus_code, :Minus_code1797 when /\A\+/ # +1798 yield :Plus_code, :Plus_code1799 when /\A\*/ # *1800 yield :Star_code, :Star_code1801 when /\A\// # /1802 yield :Slash_code, :Slash_code1803 when /\A\^/ # ^1804 yield :Caret_code, :Caret_code1805 when /\A\.\.\./ # ...1806 yield :SYM_LIST_CONTINUE, :SYM_LIST_CONTINUE1807 when /\A\.\./ # ..1808 yield :SYM_ELLIPSIS, :SYM_ELLIPSIS1809 when /\A\./ # .1810 yield :Dot_code, :Dot_code1811 when /\A\;/ # ;1812 yield :Semicolon_code, :Semicolon_code1813 when /\A\,/ # ,1814 yield :Comma_code, :Comma_code1815 when /\A\:/ # :1816 yield :Colon_code, :Colon_code1817 when /\A\!/ # !1818 yield :Exclamation_code, :Exclamation_code1819 when /\A\(/ # (1820 yield :Left_parenthesis_code, :Left_parenthesis_code1821 when /\A\)/ # )1822 yield :Right_parenthesis_code, :Right_parenthesis_code1823 when /\A\$/ # $1824 yield :Dollar_code, :Dollar_code1825 when /\A\?\?/ # ??1826 yield :SYM_DT_UNKNOWN, :SYM_DT_UNKNOWN1827 when /\A\?/ # ?1828 yield :Question_mark_code, :Question_mark_code1829 when /\A\|/ # |1830 @@logger.debug("#{__FILE__}:#{__LINE__}: scan_dadl: @in_interval = #{@in_interval} at #{@filename}:#{@lineno}")1831 if @in_interval1832 @in_interval = false1833 else1834 # @in_interval = false1835 @in_interval = true1836 end1837 @@logger.debug("#{__FILE__}:#{__LINE__}: scan_dadl: SYM_INTERVAL_DELIM at #{@filename}:#{@lineno}")1838 yield :SYM_INTERVAL_DELIM, :SYM_INTERVAL_DELIM1839 ### when /\A\[[a-zA-Z0-9()\._-]+::[a-zA-Z0-9\._-]+\]/ #V_QUALIFIED_TERM_CODE_REF form [ICD10AM(1998)::F23]1840 ### yield :V_QUALIFIED_TERM_CODE_REF, $&1841 ### when /\A\[[a-zA-Z0-9][a-zA-Z0-9._\-]*\]/ #V_LOCAL_TERM_CODE_REF1842 ### yield :V_LOCAL_TERM_CODE_REF, $&1843 ### when /\A\[[a-zA-Z0-9._\- ]+::[a-zA-Z0-9._\- ]+\]/ #ERR_V_QUALIFIED_TERM_CODE_REF1844 ### yield :ERR_V_QUALIFIED_TERM_CODE_REF, $&1845 when /\A\[/ # [1846 yield :Left_bracket_code, :Left_bracket_code1847 when /\A\]/ # ]1848 yield :Right_bracket_code, :Right_bracket_code1849 ### when /\A[A-Z][a-zA-Z0-9_-]*/1850 ### yield :V_TYPE_IDENTIFIER, $&1851 ### when /\A[A-Z][a-zA-Z0-9_]*<[a-zA-Z0-9,_<>]+>/ #V_GENERIC_TYPE_IDENTIFIER1852 ### yield :V_GENERIC_TYPE_IDENTIFIER, $&1853 ### when /\A[a-z][a-zA-Z0-9_]*/1854 ### word = $&.downcase1855 ### if @@dadl_reserved[word]1856 ### yield @@dadl_reserved[word], @@dadl_reserved[word]1857 ### else1858 ### yield :V_ATTRIBUTE_IDENTIFIER, $&1859 ### end1860 ### when /\Aa[ct][0-9.]+/ #V_LOCAL_CODE1861 ### yield :V_LOCAL_CODE, $&1862 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-]-1863 yield :V_ISO8601_EXTENDED_DATE_TIME, $&1864 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]1865 yield :V_ISO8601_EXTENDED_TIME, $&1866 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-DD1867 yield :V_ISO8601_EXTENDED_DATE, $&1868 when /\A[A-Z][a-zA-Z0-9_]*<[a-zA-Z0-9,_<>]+>/ #V_GENERIC_TYPE_IDENTIFIER1869 yield :V_GENERIC_TYPE_IDENTIFIER, $&1870 when /\A[0-9]+|[0-9]+[eE][+-]?[0-9]+/ #V_INTEGER1871 yield :V_INTEGER, $&1872 ### when /\A[0-9]+\.[0-9]+|[0-9]+\.[0-9]+[eE][+-]?[0-9]+ / #V_REAL1873 ### yield :V_REAL, $&1874 # when /\A"((?:[^"\\]+|\\.)*)"/ #V_STRING1875 ### when /\A"([^"]*)"/m #V_STRING1876 ### yield :V_STRING, $11877 when /\A[a-z]+:\/\/[^<>|\\{}^~"\[\] ]*/ #V_URI1878 yield :V_URI, $&1879 ### 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 PnYnMnWnDTnnHnnMnnS1880 ### yield :V_ISO8601_DURATION, $&1881 when /\A\S/ #UTF8CHAR1882 yield :UTF8CHAR, $&1883 end1884 data = $' # variable $' receives the string after the match1885 when :adl1886 data = scan_adl(data) do |sym, val|1887 yield sym, val1888 end1889 when :cadl1890 data = scan_cadl(data) do |sym, val|1891 yield sym, val1892 end1893 when :regexp1894 # puts "Entering scan_regexp"1895 data = scan_regexp(data) do |sym, val|1896 yield sym, val1897 end1898 when :term_constraint1899 @@logger.debug("#{__FILE__}:#{__LINE__}: scan_dadl: Entering scan_term_constraint at #{@filename}:#{@lineno}: data = #{data.inspect}")1900 1901 data = scan_term_constraint(data) do |sym, val|1902 yield sym, val1903 end1904 else1905 raise1906 end1907 end1908 end # of scan_dadl1909 1910 def scan_regexp(data)1911 @@logger.debug("#{__FILE__}:#{__LINE__}: Entering scan_regexp at #{@filename}:#{@lineno}: data = #{data.inspect}")1912 until data.nil? do1913 case @adl_type.last1914 when :regexp1915 case data1916 when /\A\/\}/ #V_REGEXP1917 if @adl_type.last == :regexp1918 @in_regexp = false1919 @adl_type.pop1920 yield :END_REGEXP_BLOCK, :END_REGEXP_BLOCK1921 else1922 raise1923 end1924 when /\A(.*)(\/\})/ #V_REGEXP1925 yield :REGEXP_BODY, $11926 if @adl_type.last == :regexp1927 @in_regexp = false1928 @adl_type.pop1929 yield :END_REGEXP_BLOCK, :END_REGEXP_BLOCK1930 else1931 raise1932 end1933 else1934 raise data1935 end1936 data = $' # variable $' receives the string after the match1937 when :adl1938 data = scan_adl(data) do |sym, val|1939 yield sym, val1940 end1941 when :dadl1942 data = scan_dadl(data) do |sym, val|1943 yield sym, val1944 end1945 when :cadl1946 data = scan_cadl(data) do |sym, val|1947 yield sym, val1948 end1949 when :term_constraint1950 @@logger.debug("#{__FILE__}:#{__LINE__}: scan_regexp: Entering scan_term_constraint at #{@filename}:#{@lineno}")1951 data = scan_term_constraint(data) do |sym, val|1952 yield sym, val1953 end1954 else1955 raise1956 end1957 end1958 end # of scan_regexp1959 1960 def scan_term_constraint(data)1961 @@logger.debug("#{__FILE__}:#{__LINE__}: Entering scan_term_constraint")1962 until data.nil? do1963 case @adl_type.last1964 when :term_constraint1965 case data1966 when /\A\n/ # carriage return1967 @lineno += 11968 ;1969 when /\A[ \t\r\f]+/ #just drop it1970 ;1971 when /\A--.*$/ # single line comment1972 @lineno += 11973 #@@logger.debug("#{__FILE__}:#{__LINE__}: scan_term_constraint: COMMENT = #{$&} at #{@filename}:#{@lineno}")1974 ;1975 when /\A([a-zA-Z0-9\._\-])+[ \t]*,/ # match any line, with ',' termination1976 yield :TERM_CODE, $11977 when /\A([a-zA-Z0-9\._\-])+[ \t]*;/ # match second last line with ';' termination (assumed value)1978 yield :TERM_CODE, $11979 when /\A([a-zA-Z0-9\._\-])*[ \t]*\]/ # match final line, terminating in ']'1980 adl_type = @adl_type.pop1981 assert_at(__FILE__,__LINE__){adl_type == :term_constraint}1982 yield :END_TERM_CODE_CONSTRAINT, $11983 else1984 raise "data = #{data}"1985 end1986 data = $' # variable $' receives the string after the match1987 when :adl1988 data = scan_adl(data) do |sym, val|1989 yield sym, val1990 end1991 when :dadl1992 data = scan_dadl(data) do |sym, val|1993 yield sym, val1994 end1995 when :cadl1996 data = scan_cadl(data) do |sym, val|1997 yield sym, val1998 end1999 else2000 raise2001 end2002 end2003 end # of scan_term_constraint2004 1296 2005 1297 … … 2022 1314 2023 1315 2024 1316 __END__ 2025 1317 2026 1318 -
ruby/trunk/lib/adl_parser/test/adl/openEHR-EHR-COMPOSITION.encounter.v1draft.adl
r116 r283 10 10 ["name"] = <"Thomas Beale"> 11 11 ["organisation"] = <"Ocean Informatics"> 12 ["date"] = <" 2005-10-10">12 ["date"] = <"10/10/2005"> 13 13 > 14 14 details = < -
ruby/trunk/lib/adl_parser/test/adl/openEHR-EHR-OBSERVATION.apgar.v1.adl
r116 r283 25 25 ["name"] = <"Sam Heard"> 26 26 ["organisation"] = <"Ocean Informatics"> 27 ["date"] = <" 2004-05-18">27 ["date"] = <"18/05/2004"> 28 28 ["email"] = <"sam.heard@oceaninformatics.biz"> 29 29 > … … 45 45 ["de"] = < 46 46 language = <[ISO_639-1::de]> 47 purpose = <"Zur Dokumentation des Apgar Wertes oder Beurteilung f%G �%@r Neugeborene. Der zu Grunde liegende Zeitpunkt der Ereignisreihe ist immer die Geburt.">48 use = <"Erm%G �%@glicht die Dokumentation des Wohlergehens des S%G�%@uglings 1, 2, 5 und/ oder 10 Minuten nach der Geburt. Die Summe kann einzeln dokumentiert werden - falls nur diese verf%G�%@gbar ist - es sollten aber alle f%G�%@nf Zahlenwerte vervollst%G�%@ndigt werden, damit die Summe errechnet werden kann. Die Gesamtsumme ist die Summe der f%G�%@nf Zahlenwerte (minimal 0, maximal 10).">47 purpose = <"Zur Dokumentation des Apgar Wertes oder Beurteilung f%G�%@r Neugeborene. Der zu Grunde liegende Zeitpunkt der Ereignisreihe ist immer die Geburt."> 48 use = <"Erm%G�%@glicht die Dokumentation des Wohlergehens des S%G�%@uglings 1, 2, 5 und/ oder 10 Minuten nach der Geburt. Die Summe kann einzeln dokumentiert werden - falls nur diese verf%G�%@gbar ist - es sollten aber alle f%G�%@nf Zahlenwerte vervollst%G�%@ndigt werden, damit die Summe errechnet werden kann. Die Gesamtsumme ist die Summe der f%G�%@nf Zahlenwerte (minimal 0, maximal 10)."> 49 49 keywords = <"Apgar", "Neugeborenes", "Index", "Wert"> 50 misuse = <"Nur teilweise Vervollst%G �%@ndigung der Werte und Addieren von weniger als f%G�%@nf Werten zur Gesamtsumme.">50 misuse = <"Nur teilweise Vervollst%G�%@ndigung der Werte und Addieren von weniger als f%G�%@nf Werten zur Gesamtsumme."> 51 51 > 52 52 > … … 414 414 items = < 415 415 ["at0000"] = < 416 description = <"Klinischer Wert, abgeleitet von der Beurteilung der Atmung, der Hautfarbe, dem Muskeltonus, der Herzfrequenz und der Reaktion von Reflexen, %G �%@blicherweise 1, 5 und 10 Minuten nach der Geburt erhoben">416 description = <"Klinischer Wert, abgeleitet von der Beurteilung der Atmung, der Hautfarbe, dem Muskeltonus, der Herzfrequenz und der Reaktion von Reflexen, %G�%@blicherweise 1, 5 und 10 Minuten nach der Geburt erhoben"> 417 417 text = <"Apgar Wert"> 418 418 > … … 438 438 > 439 439 ["at0007"] = < 440 description = <"Herzfrequenz von weniger als 100 Schl%G �%@gen pro Minute">441 text = <"Weniger als 100 Schl%G �%@ge pro Minute">440 description = <"Herzfrequenz von weniger als 100 Schl%G�%@gen pro Minute"> 441 text = <"Weniger als 100 Schl%G�%@ge pro Minute"> 442 442 > 443 443 ["at0008"] = < 444 description = <"Herzfrequenz von mehr als oder genau 100 Schl%G �%@gen pro Minute">445 text = <"Mehr als oder genau 100 Schl%G �%@ge pro Minute">444 description = <"Herzfrequenz von mehr als oder genau 100 Schl%G�%@gen pro Minute"> 445 text = <"Mehr als oder genau 100 Schl%G�%@ge pro Minute"> 446 446 > 447 447 ["at0009"] = < … … 478 478 > 479 479 ["at0017"] = < 480 description = <"Beurteilung der Reaktion des Neugeborenen auf die Absaugung der Nasenl%G �%@cher">480 description = <"Beurteilung der Reaktion des Neugeborenen auf die Absaugung der Nasenl%G�%@cher"> 481 481 text = <"Reflexantwort"> 482 482 > 483 483 ["at0018"] = < 484 description = <"kein W%G �%@rgen oder keine Reaktion auf das Absaugen der Atemwege">484 description = <"kein W%G�%@rgen oder keine Reaktion auf das Absaugen der Atemwege"> 485 485 text = <"Keine Reaktion auf die Absaugung der Atemwege"> 486 486 > 487 487 ["at0019"] = < 488 488 description = <"Grimasse als einzige Reaktion auf das Absaugen der Atemwege"> 489 text = <"Grimasse w%G �%@hrend der Absaugung der Atemwege">489 text = <"Grimasse w%G�%@hrend der Absaugung der Atemwege"> 490 490 > 491 491 ["at0020"] = < 492 description = <"Grimasse und husten, niesen oder w%G �%@rgen als Reaktion auf die Absaugung der Atemwege">493 text = <"Grimasse und Husten/Niesen w%G �%@hrend der Absaugung der Atemwege ">492 description = <"Grimasse und husten, niesen oder w%G�%@rgen als Reaktion auf die Absaugung der Atemwege"> 493 text = <"Grimasse und Husten/Niesen w%G�%@hrend der Absaugung der Atemwege "> 494 494 > 495 495 ["at0021"] = < 496 description = <"Die Farbe der Haut am K%G �%@rper, am Rumpf und an den Gliedern">496 description = <"Die Farbe der Haut am K%G�%@rper, am Rumpf und an den Gliedern"> 497 497 text = <"Hautfarbe"> 498 498 > 499 499 ["at0022"] = < 500 description = <"Der K%G �%@rper ist blass oder blau gef%G�%@rbt">501 text = <"Gesamter K%G �%@rper ist blau oder blass">500 description = <"Der K%G�%@rper ist blass oder blau gef%G�%@rbt"> 501 text = <"Gesamter K%G�%@rper ist blau oder blass"> 502 502 > 503 503 ["at0023"] = < 504 description = <"Der K%G �%@rper ist rosig, H%G�%@nde und F%G��%@e sind blass oder blau">505 text = <"Gesunde K%G �%@rperfarbe, blaue H%G�%@nde oder F%G��%@e">504 description = <"Der K%G�%@rper ist rosig, H%G�%@nde und F%G��%@e sind blass oder blau"> 505 text = <"Gesunde K%G�%@rperfarbe, blaue H%G�%@nde oder F%G��%@e"> 506 506 > 507 507 ["at0024"] = < 508 description = <"Rosige oder gesunde F%G �%@rbung des gesamten K%G�%@rpers">509 text = <"Vollst%G �%@ndig gesunde oder rosige Farbe">508 description = <"Rosige oder gesunde F%G�%@rbung des gesamten K%G�%@rpers"> 509 text = <"Vollst%G�%@ndig gesunde oder rosige Farbe"> 510 510 > 511 511 ["at0025"] = < -
ruby/trunk/lib/adl_parser/test/parser_test.rb
r261 r283 10 10 end 11 11 12 must "openEHR-EHR-OBSERVATION.body_mass_index.v1.adl be properly parsed" do 13 body_mass_index = File.read("#{TEST_ROOT_DIR}/adl/openEHR-EHR-OBSERVATION.body_mass_index.v1.adl") 14 assert_nothing_raised do 15 ast = @parser.parse(body_mass_index, 'openEHR-EHR-OBSERVATION.body_mass_index.v1.adl') 12 must "test_archetype_id.adl be properly parsed" do 13 file = File.read("#{TEST_ROOT_DIR}/adl/test_archetype_id.adl") 14 assert_nothing_raised do 15 ast = @parser.parse(file, 'openEHR-EHR-SECTION.summary.v1') 16 assert_instance_of OpenEHR::RM::Support::Identification::Archetype_ID, ast.archetype_id 17 end 18 end 19 20 must "openEHR-EHR-ACTION.imaging.v1.adl be properly parsed" do 21 file = File.read("#{TEST_ROOT_DIR}/adl/openEHR-EHR-ACTION.imaging.v1.adl") 22 assert_nothing_raised do 23 ast = @parser.parse(file, 'openEHR-EHR-ACTION.imaging.v1') 24 assert_instance_of OpenEHR::RM::Support::Identification::Archetype_ID, ast.archetype_id 25 end 26 end 27 28 must "openEHR-EHR-ACTION.referral.v1.adl be properly parsed" do 29 file = File.read("#{TEST_ROOT_DIR}/adl/openEHR-EHR-ACTION.referral.v1.adl") 30 assert_nothing_raised do 31 ast = @parser.parse(file, 'openEHR-EHR-ACTION.referral.v1') 32 assert_instance_of OpenEHR::RM::Support::Identification::Archetype_ID, ast.archetype_id 33 end 34 end 35 36 must "openEHR-EHR-CLUSTER.auscultation-chest.v1.adl be properly parsed" do 37 file = File.read("#{TEST_ROOT_DIR}/adl/openEHR-EHR-CLUSTER.auscultation-chest.v1.adl") 38 assert_nothing_raised do 39 ast = @parser.parse(file, 'openEHR-EHR-CLUSTER.auscultation-chest.v1') 40 assert_instance_of OpenEHR::RM::Support::Identification::Archetype_ID, ast.archetype_id 41 end 42 end 43 44 must "openEHR-EHR-CLUSTER.auscultation.v1.adl be properly parsed" do 45 file = File.read("#{TEST_ROOT_DIR}/adl/openEHR-EHR-CLUSTER.auscultation.v1.adl") 46 assert_nothing_raised do 47 ast = @parser.parse(file, 'openEHR-EHR-CLUSTER.auscultation.v1') 48 assert_instance_of OpenEHR::RM::Support::Identification::Archetype_ID, ast.archetype_id 49 end 50 end 51 52 53 must "openEHR-EHR-CLUSTER.exam-abdomen.v1.adl be properly parsed" do 54 file = File.read("#{TEST_ROOT_DIR}/adl/openEHR-EHR-CLUSTER.exam-abdomen.v1.adl") 55 assert_nothing_raised do 56 ast = @parser.parse(file, 'openEHR-EHR-CLUSTER.exam-abdomen.v1') 57 assert_instance_of OpenEHR::RM::Support::Identification::Archetype_ID, ast.archetype_id 58 end 59 end 60 61 must "openEHR-EHR-CLUSTER.exam-chest.v1.adl be properly parsed" do 62 file = File.read("#{TEST_ROOT_DIR}/adl/openEHR-EHR-CLUSTER.exam-chest.v1.adl") 63 assert_nothing_raised do 64 ast = @parser.parse(file, 'openEHR-EHR-CLUSTER.exam-chest.v1') 65 assert_instance_of OpenEHR::RM::Support::Identification::Archetype_ID, ast.archetype_id 66 end 67 end 68 69 must "openEHR-EHR-CLUSTER.exam-generic-joint.v1.adl be properly parsed" do 70 file = File.read("#{TEST_ROOT_DIR}/adl/openEHR-EHR-CLUSTER.exam-generic-joint.v1.adl") 71 assert_nothing_raised do 72 ast = @parser.parse(file, 'openEHR-EHR-CLUSTER.exam-generic-joint.v1') 73 assert_instance_of OpenEHR::RM::Support::Identification::Archetype_ID, ast.archetype_id 74 end 75 end 76 77 must "openEHR-EHR-CLUSTER.exam-generic-lymphnode.v1.adl be properly parsed" do 78 file = File.read("#{TEST_ROOT_DIR}/adl/openEHR-EHR-CLUSTER.exam-generic-lymphnode.v1.adl") 79 assert_nothing_raised do 80 ast = @parser.parse(file, 'openEHR-EHR-CLUSTER.exam-generic-lymphnode.v1') 81 assert_instance_of OpenEHR::RM::Support::Identification::Archetype_ID, ast.archetype_id 82 end 83 end 84 85 must "openEHR-EHR-CLUSTER.exam-generic-mass.v1.adl be properly parsed" do 86 file = File.read("#{TEST_ROOT_DIR}/adl/openEHR-EHR-CLUSTER.exam-generic-mass.v1.adl") 87 assert_nothing_raised do 88 ast = @parser.parse(file, 'openEHR-EHR-CLUSTER.exam-generic-mass.v1') 89 assert_instance_of OpenEHR::RM::Support::Identification::Archetype_ID, ast.archetype_id 90 end 91 end 92 93 must "openEHR-EHR-CLUSTER.exam-generic.v1.adl be properly parsed" do 94 file = File.read("#{TEST_ROOT_DIR}/adl/openEHR-EHR-CLUSTER.exam-generic.v1.adl") 95 assert_nothing_raised do 96 ast = @parser.parse(file, 'openEHR-EHR-CLUSTER.exam-generic.v1') 97 assert_instance_of OpenEHR::RM::Support::Identification::Archetype_ID, ast.archetype_id 98 end 99 end 100 101 must "openEHR-EHR-CLUSTER.exam-nervous_system.v1.adl be properly parsed" do 102 file = File.read("#{TEST_ROOT_DIR}/adl/openEHR-EHR-CLUSTER.exam-nervous_system.v1.adl") 103 assert_nothing_raised do 104 ast = @parser.parse(file, 'openEHR-EHR-CLUSTER.exam-nervous_system.v1') 105 assert_instance_of OpenEHR::RM::Support::Identification::Archetype_ID, ast.archetype_id 106 end 107 end 108 109 must "openEHR-EHR-COMPOSITION.discharge.v1draft.adl be properly parsed" do 110 file = File.read("#{TEST_ROOT_DIR}/adl/openEHR-EHR-COMPOSITION.discharge.v1draft.adl") 111 assert_nothing_raised do 112 ast = @parser.parse(file, 'openEHR-EHR-COMPOSITION.discharge.v1draft') 113 assert_instance_of OpenEHR::RM::Support::Identification::Archetype_ID, ast.archetype_id 114 end 115 end 116 117 must "openEHR-EHR-COMPOSITION.encounter.v1draft.adl be properly parsed" do 118 file = File.read("#{TEST_ROOT_DIR}/adl/openEHR-EHR-COMPOSITION.encounter.v1draft.adl") 119 assert_nothing_raised do 120 ast = @parser.parse(file, 'openEHR-EHR-COMPOSITION.encounter.v1draft') 121 assert_instance_of OpenEHR::RM::Support::Identification::Archetype_ID, ast.archetype_id 122 end 123 end 124 125 must "openEHR-EHR-INSTRUCTION.medication.v1.adl be properly parsed" do 126 file = File.read("#{TEST_ROOT_DIR}/adl/openEHR-EHR-INSTRUCTION.medication.v1.adl") 127 assert_nothing_raised do 128 ast = @parser.parse(file, 'openEHR-EHR-INSTRUCTION.medication.v1') 129 assert_instance_of OpenEHR::RM::Support::Identification::Archetype_ID, ast.archetype_id 130 end 131 end 132 133 must "openEHR-EHR-INSTRUCTION.referral.v1.adl be properly parsed" do 134 file = File.read("#{TEST_ROOT_DIR}/adl/openEHR-EHR-INSTRUCTION.referral.v1.adl") 135 assert_nothing_raised do 136 ast = @parser.parse(file, 'openEHR-EHR-INSTRUCTION.referral.v1') 16 137 assert_instance_of OpenEHR::RM::Support::Identification::Archetype_ID, ast.archetype_id 17 138 end … … 19 140 20 141 must "openEHR-EHR-ITEM_TREE.Laboratory_request.v1.adl be properly parsed" do 21 laboratory_request = File.read("#{TEST_ROOT_DIR}/adl/openEHR-EHR-ITEM_TREE.Laboratory_request.v1.adl") 22 assert_nothing_raised do 23 result = @parser.parse(laboratory_request, 'openEHR-EHR-ITEM_TREE.Laboratory_request.v1') 24 assert_instance_of OpenEHR::AM::Archetype::ARCHETYPE, result 25 assert_instance_of OpenEHR::AM::Archetype::Archetype_Description::ARCHETYPE_DESCRIPTION, result.description 26 assert_instance_of OpenEHR::AM::Archetype::Constraint_Model::C_COMPLEX_OBJECT, result.definition 27 end 28 end 142 file = File.read("#{TEST_ROOT_DIR}/adl/openEHR-EHR-ITEM_TREE.Laboratory_request.v1.adl") 143 assert_nothing_raised do 144 ast = @parser.parse(file, 'openEHR-EHR-ITEM_TREE.Laboratory_request.v1') 145 assert_instance_of OpenEHR::RM::Support::Identification::Archetype_ID, ast.archetype_id 146 end 147 end 148 29 149 30 150 must "openEHR-EHR-OBSERVATION.apgar.v1.adl be properly parsed" do 31 apgar = File.read("#{TEST_ROOT_DIR}/adl/openEHR-EHR-OBSERVATION.apgar.v1.adl") 32 assert_nothing_raised do 33 result = @parser.parse(apgar, 'openEHR-EHR-OBSERVATION.apgar.v1') 34 assert_instance_of OpenEHR::AM::Archetype::ARCHETYPE, result 35 assert_instance_of OpenEHR::AM::Archetype::Archetype_Description::ARCHETYPE_DESCRIPTION, result.description 36 assert_instance_of OpenEHR::AM::Archetype::Constraint_Model::C_COMPLEX_OBJECT, result.definition 37 end 38 end 39 40 must "openEHR-EHR-EVALUATION.adverse.v1.adl be properly parsed" do 41 evaluation = File.read("#{TEST_ROOT_DIR}/adl/openEHR-EHR-EVALUATION.adverse.v1.adl") 42 assert_nothing_raised do 43 @parser.parse(evaluation, 'openEHR-EHR-EVALUATION.adverse.v1') 44 end 45 end 46 47 must "openEHR-EHR-ITEM_TREE.referral.v1.adl be properly parsed" do 48 referral = File.read("#{TEST_ROOT_DIR}/adl/openEHR-EHR-ITEM_TREE.referral.v1.adl") 49 assert_nothing_raised do 50 @parser.parse(referral, 'openEHR-EHR-ITEM_TREE.referral.v1') 51 end 52 end 53 54 must "openEHR-EHR-CLUSTER.exam-fetus.v1.adl be properly parsed" do 55 exam_fetus = File.read("#{TEST_ROOT_DIR}/adl/openEHR-EHR-CLUSTER.exam-fetus.v1.adl") 56 assert_nothing_raised do 57 @parser.parse(exam_fetus, 'openEHR-EHR-CLUSTER.exam-fetus.v1') 58 end 59 end 60 61 must "openEHR-EHR-CLUSTER.exam-uterine_cervix.v1.adl be properly parsed" do 62 exam_uterine_cervix = File.read("#{TEST_ROOT_DIR}/adl/openEHR-EHR-CLUSTER.exam-uterine_cervix.v1.adl") 63 assert_nothing_raised do 64 @parser.parse(exam_uterine_cervix, 'openEHR-EHR-CLUSTER.exam-uterine_cervix.v1') 65 end 66 end 67 68 must "openEHR-EHR-ACTION.imaging.v1.adl be properly parsed" do 69 imaging = File.read("#{TEST_ROOT_DIR}/adl/openEHR-EHR-ACTION.imaging.v1.adl") 70 assert_nothing_raised do 71 @parser.parse(imaging, 'openEHR-EHR-ACTION.imaging.v1') 72 end 73 end 74 75 must "openEHR-EHR-CLUSTER.exam-nervous_system.v1.adl be properly parsed" do 76 exam_nervous_system = File.read("#{TEST_ROOT_DIR}/adl/openEHR-EHR-CLUSTER.exam-nervous_system.v1.adl") 77 assert_nothing_raised do 78 @parser.parse(exam_nervous_system, 'openEHR-EHR-CLUSTER.exam-nervous_system.v1') 79 end 80 end 81 82 must "openEHR-EHR-CLUSTER.exam-generic.v1.adl be properly parsed" do 83 exam_generic = File.read("#{TEST_ROOT_DIR}/adl/openEHR-EHR-CLUSTER.exam-generic.v1.adl") 84 assert_nothing_raised do 85 @parser.parse(exam_generic, 'openEHR-EHR-CLUSTER.exam-generic.v1') 86 end 87 end 88 89 must "openEHR-EHR-CLUSTER.exam-generic-mass.v1.adl be properly parsed" do 90 exam_generic_mass = File.read("#{TEST_ROOT_DIR}/adl/openEHR-EHR-CLUSTER.exam-generic-mass.v1.adl") 91 assert_nothing_raised do 92 @parser.parse(exam_generic_mass, 'openEHR-EHR-CLUSTER.exam-generic-mass.v1') 93 end 94 end 95 96 must "openEHR-EHR-CLUSTER.exam-generic-lymphnode.v1.adl be properly parsed" do 97 exam_generic_lymphnode = File.read("#{TEST_ROOT_DIR}/adl/openEHR-EHR-CLUSTER.exam-generic-lymphnode.v1.adl") 98 assert_nothing_raised do 99 @parser.parse(exam_generic_lymphnode, 'openEHR-EHR-CLUSTER.exam-generic-lymphnode.v1') 100 end 101 end 102 103 must "openEHR-EHR-CLUSTER.exam-generic-joint.v1.adl be properly parsed" do 104 exam_generic_joint = File.read("#{TEST_ROOT_DIR}/adl/openEHR-EHR-CLUSTER.exam-generic-joint.v1.adl") 105 assert_nothing_raised do 106 @parser.parse(exam_generic_joint, 'openEHR-EHR-CLUSTER.exam-generic-joint.v1') 107 end 108 end 109 110 must "openEHR-EHR-CLUSTER.exam-chest.v1.adl be properly parsed" do 111 exam_chest = File.read("#{TEST_ROOT_DIR}/adl/openEHR-EHR-CLUSTER.exam-chest.v1.adl") 112 assert_nothing_raised do 113 @parser.parse(exam_chest, 'openEHR-EHR-CLUSTER.exam-chest.v1') 114 end 115 end 116 117 must "openEHR-EHR-CLUSTER.exam-abdomen.v1.adl be properly parsed" do 118 exam_abdomen = File.read("#{TEST_ROOT_DIR}/adl/openEHR-EHR-CLUSTER.exam-abdomen.v1.adl") 119 assert_nothing_raised do 120 @parser.parse(exam_abdomen, 'openEHR-EHR-CLUSTER.exam-abdomen.v1') 121 end 122 end 123 124 must "openEHR-EHR-CLUSTER.auscultation.v1.adl be properly parsed" do 125 cluster_auscultation = File.read("#{TEST_ROOT_DIR}/adl/openEHR-EHR-CLUSTER.auscultation.v1.adl") 126 assert_nothing_raised do 127 @parser.parse(cluster_auscultation, 'openEHR-EHR-CLUSTER.auscultation.v1') 128 end 129 end 130 131 must "openEHR-EHR-CLUSTER.auscultation-chest.v1.adl be properly parsed" do 132 cluster_auscultation_chest = File.read("#{TEST_ROOT_DIR}/adl/openEHR-EHR-CLUSTER.auscultation-chest.v1.adl") 133 assert_nothing_raised do 134 @parser.parse(cluster_auscultation_chest, 'openEHR-EHR-CLUSTER.auscultation-chest.v1') 135 end 136 end 151 file = File.read("#{TEST_ROOT_DIR}/adl/openEHR-EHR-OBSERVATION.apgar.v1.adl") 152 assert_nothing_raised do 153 ast = @parser.parse(file, 'openEHR-EHR-OBSERVATION.apgar.v1') 154 assert_instance_of OpenEHR::RM::Support::Identification::Archetype_ID, ast.archetype_id 155 end 156 end 157 158 must "openEHR-EHR-SECTION.findings.v1.adl be properly parsed" do 159 file = File.read("#{TEST_ROOT_DIR}/adl/openEHR-EHR-SECTION.findings.v1.adl") 160 assert_nothing_raised do 161 ast = @parser.parse(file, 'openEHR-EHR-SECTION.findings.v1') 162 assert_instance_of OpenEHR::RM::Support::Identification::Archetype_ID, ast.archetype_id 163 end 164 end 165 166 must "openEHR-EHR-SECTION.reason_for_encounter.v1.adl be properly parsed" do 167 file = File.read("#{TEST_ROOT_DIR}/adl/openEHR-EHR-SECTION.reason_for_encounter.v1.adl") 168 assert_nothing_raised do 169 ast = @parser.parse(file, 'openEHR-EHR-SECTION.reason_for_encounter.v1') 170 assert_instance_of OpenEHR::RM::Support::Identification::Archetype_ID, ast.archetype_id 171 end 172 end 173 137 174 138 175 must "openEHR-EHR-SECTION.vital_signs.v1.adl be properly parsed" do 139 vital_signs = File.read("#{TEST_ROOT_DIR}/adl/openEHR-EHR-SECTION.vital_signs.v1.adl") 140 assert_nothing_raised do 141 @parser.parse(vital_signs, 'openEHR-EHR-SECTION.vital_signs.v1') 142 end 143 end 144 145 must "openEHR-EHR-SECTION.summary.v1.adl be properly parsed" do 146 summary = File.read("#{TEST_ROOT_DIR}/adl/openEHR-EHR-SECTION.summary.v1.adl") 147 assert_nothing_raised do 148 @parser.parse(summary, 'openEHR-EHR-SECTION.summary.v1') 149 end 150 end 151 152 must "openEHR-EHR-SECTION.findings.v1.adl be properly parsed" do 153 findings = File.read("#{TEST_ROOT_DIR}/adl/openEHR-EHR-SECTION.findings.v1.adl") 154 assert_nothing_raised do 155 @parser.parse(findings, 'openEHR-EHR-SECTION.findings.v1') 156 end 157 end 158 159 must "openEHR-EHR-SECTION.reason_for_encounter.v1.adl be properly parsed" do 160 reason_for_encounter = File.read("#{TEST_ROOT_DIR}/adl/openEHR-EHR-SECTION.reason_for_encounter.v1.adl") 161 assert_nothing_raised do 162 @parser.parse(reason_for_encounter, 'openEHR-EHR-SECTION.reason_for_encounter.v1') 163 end 164 end 165 166 must "openEHR-EHR-ITEM_TREE.imaging.v1.adl be properly parsed" do 167 imaging = File.read("#{TEST_ROOT_DIR}/adl/openEHR-EHR-ITEM_TREE.imaging.v1.adl") 168 assert_nothing_raised do 169 @parser.parse(imaging, 'openEHR-EHR-ITEM_TREE.imaging.v1') 170 end 171 end 172 173 must "openEHR-EHR-INSTRUCTION.referral.v1.adl be properly parsed" do 174 instruction_referral = File.read("#{TEST_ROOT_DIR}/adl/openEHR-EHR-INSTRUCTION.referral.v1.adl") 175 assert_nothing_raised do 176 @parser.parse(instruction_referral, 'openEHR-EHR-INSTRUCTION.referral.v1') 177 end 178 end 179 180 must "openEHR-EHR-INSTRUCTION.medication.v1.adl be properly parsed" do 181 instruction_medication = File.read("#{TEST_ROOT_DIR}/adl/openEHR-EHR-INSTRUCTION.medication.v1.adl") 182 assert_nothing_raised do 183 @parser.parse(instruction_medication, 'openEHR-EHR-INSTRUCTION.medication.v1') 184 end 185 end 186 187 must "openEHR-EHR-ACTION.referral.v1.adl be properly parsed" do 188 action_referral = File.read("#{TEST_ROOT_DIR}/adl/openEHR-EHR-ACTION.referral.v1.adl") 189 assert_nothing_raised do 190 @parser.parse(action_referral, 'openEHR-EHR-ACTION.referral.v1') 191 end 192 end 193 194 must "openEHR-EHR-CLUSTER.dimensions.v1.adl be properly parsed" do 195 dimensions_circumference = File.read("#{TEST_ROOT_DIR}/adl/openEHR-EHR-CLUSTER.dimensions.v1.adl") 196 assert_nothing_raised do 197 @parser.parse(dimensions_circumference, 'openEHR-EHR-CLUSTER.dimensions.v1') 198 end 199 end 200 201 must "openEHR-EHR-COMPOSITION.discharge.v1draft.adl be properly parsed" do 202 discharge = File.read("#{TEST_ROOT_DIR}/adl/openEHR-EHR-COMPOSITION.discharge.v1draft.adl") 203 assert_nothing_raised do 204 @parser.parse(discharge, 'openEHR-EHR-COMPOSITION.discharge.v1draft') 205 end 206 end 207 208 must "openEHR-EHR-COMPOSITION.encounter.v1draft.adl be properly parsed" do 209 encounter = File.read("#{TEST_ROOT_DIR}/adl/openEHR-EHR-COMPOSITION.encounter.v1draft.adl") 210 assert_nothing_raised do 211 @parser.parse(encounter, 'openEHR-EHR-COMPOSITION.encounter.v1draft') 212 end 213 end 214 215 must "openEHR-EHR-ITEM_TREE.medication.v1.adl be properly parsed" do 216 medication = File.read("#{TEST_ROOT_DIR}/adl/openEHR-EHR-ITEM_TREE.medication.v1.adl") 217 assert_nothing_raised do 218 @parser.parse(medication, 'openEHR-EHR-ITEM_TREE.medication.v1.adl') 219 end 220 end 176 file = File.read("#{TEST_ROOT_DIR}/adl/openEHR-EHR-SECTION.vital_signs.v1.adl") 177 assert_nothing_raised do 178 ast = @parser.parse(file, 'openEHR-EHR-SECTION.vital_signs.v1') 179 assert_instance_of OpenEHR::RM::Support::Identification::Archetype_ID, ast.archetype_id 180 end 181 end 182 183 184 # 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::Archetype_ID, 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::Archetype_ID, 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::Archetype_ID, 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::Archetype_ID, 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::Archetype_ID, 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::Archetype_ID, ast.archetype_id 229 # end 230 # end 231 232 221 233 end -
ruby/trunk/lib/adl_parser/test/scanner_test.rb
r261 r283 1 1 require File.dirname(__FILE__) + '/test_helper.rb' 2 2 3 class YaparcParserTest < Test::Unit::TestCase 4 must "assert root scanner instance" do 5 parser = OpenEHR::ADL::Scanner::DADL::RootScanner.new 6 assert_instance_of OpenEHR::ADL::Scanner::DADL::RootScanner,parser 7 result = parser.parse('') 3 class ADLScannerTest < Test::Unit::TestCase 4 def setup 5 @scanner = OpenEHR::ADL::Scanner::ADLScanner.new([:adl], "filename") 8 6 end 9 7 10 # \[{ALPHANUM}{NAMECHAR}*\] 11 must "assert V_LOCAL_TERM_CODE_REF scanner is properly working" do 12 parser = OpenEHR::ADL::Scanner::Common::V_LOCAL_TERM_CODE_REF.new 13 assert_instance_of OpenEHR::ADL::Scanner::Common::V_LOCAL_TERM_CODE_REF,parser 14 result = parser.parse('[en-us]') 15 assert_instance_of Yaparc::Result::OK, result 8 must "assert OpenEHR::ADL::Scanner::ADLScanner scanner instance" do 9 assert_instance_of OpenEHR::ADL::Scanner::ADLScanner, @scanner 16 10 end 17 11 18 must "assert V_QUALIFIED_TERM_CODE_REF scanner is properly working" do 19 parser = OpenEHR::ADL::Scanner::Common::V_QUALIFIED_TERM_CODE_REF.new 20 assert_instance_of OpenEHR::ADL::Scanner::Common::V_QUALIFIED_TERM_CODE_REF,parser 21 result = parser.parse('[ISO_639::en]') 22 assert_instance_of Yaparc::Result::OK, result 23 result = parser.parse('[ISO_639::en-us]') 24 assert_instance_of Yaparc::Result::OK, result 12 must "assert ADLScanner scanner scan CR and lineno incremented" do 13 lineno = @scanner.lineno 14 @scanner.scan("\n") 15 assert_equal lineno+1, @scanner.lineno 25 16 end 26 17 27 must "assert V_STRING scanner is properly working" do 28 parser = OpenEHR::ADL::Scanner::Common::V_STRING.new 29 assert_instance_of OpenEHR::ADL::Scanner::Common::V_STRING,parser 30 result = parser.parse('"this is a string"') 31 assert_instance_of Yaparc::Result::OK, result 32 result = parser.parse('"en-us"') 33 assert_instance_of Yaparc::Result::OK, result 18 must "assert ADLScanner scanner scan ARCHETYPE_ID" do 19 lineno = @scanner.lineno 20 @scanner.scan("openEHR-EHR-OBSERVATION.body_mass_index.v1") do |sym, val| 21 assert_equal :V_ARCHETYPE_ID,sym 22 assert_instance_of OpenEHR::RM::Support::Identification::Archetype_ID,val 23 end 34 24 end 35 25 36 must "assert V_REAL scanner is properly working" do 37 parser = OpenEHR::ADL::Scanner::Common::V_REAL.new 38 assert_instance_of OpenEHR::ADL::Scanner::Common::V_REAL,parser 39 result = parser.parse('0.1') 40 assert_instance_of Yaparc::Result::OK, result 41 result = parser.parse('0.0..20000.0') 42 assert_instance_of Yaparc::Result::OK, result 43 assert_equal [:V_REAL, "0.0"], result.value 44 assert_equal "..20000.0", result.input 26 must "assert ADLScanner scanner scan white space and lineno unchanged" do 27 lineno = @scanner.lineno 28 @scanner.scan(" ") 29 assert_equal lineno, @scanner.lineno 45 30 end 46 31 47 must "assert V_ISO8601_DURATION scanner is properly working" do 48 parser = OpenEHR::ADL::Scanner::Common::V_ISO8601_DURATION.new 49 assert_instance_of OpenEHR::ADL::Scanner::Common::V_ISO8601_DURATION,parser 50 result = parser.parse('PT1M') 51 assert_instance_of Yaparc::Result::OK, result 52 result = parser.parse('PYMWDTHMS') 53 assert_instance_of Yaparc::Result::OK, result 54 assert_equal [:V_ISO8601_DURATION, "PYMWDTHMS"], result.value 32 must "assert ADLScanner scanner scan V_QUALIFIED_TERM_CODE_REF" do 33 @scanner.scan("[ICD10AM(1998)::F23]") do |sym, val| 34 assert_equal :V_QUALIFIED_TERM_CODE_REF,sym 35 assert_equal "ICD10AM(1998)::F23",val 36 end 37 end 38 end 39 40 class CADLScannerTest < Test::Unit::TestCase 41 def setup 42 @scanner = OpenEHR::ADL::Scanner::CADLScanner.new([:cadl], "filename") 55 43 end 56 44 57 must "assert V_ISO8601_DATE_TIME_CONSTRAINT_PATTERN scanner is properly working" do 58 parser = OpenEHR::ADL::Scanner::CADL::V_ISO8601_DATE_TIME_CONSTRAINT_PATTERN.new 59 assert_instance_of OpenEHR::ADL::Scanner::CADL::V_ISO8601_DATE_TIME_CONSTRAINT_PATTERN,parser 60 result = parser.parse('yyyy-??-??T??:??:??') 61 assert_instance_of Yaparc::Result::OK, result 45 must "assert OpenEHR::ADL::Scanner::CADLScanner scanner instance" do 46 assert_instance_of OpenEHR::ADL::Scanner::CADLScanner, @scanner 62 47 end 63 48 64 must "assert V_ISO8601_DATE_CONSTRAINT_PATTERN scanner is properly working" do 65 parser = OpenEHR::ADL::Scanner::CADL::V_ISO8601_DATE_CONSTRAINT_PATTERN.new 66 assert_instance_of OpenEHR::ADL::Scanner::CADL::V_ISO8601_DATE_CONSTRAINT_PATTERN,parser 67 result = parser.parse('yyyy-mm-XX-dd') 68 assert_instance_of Yaparc::Result::OK, result 49 must "assert CADLScanner scanner scan V_ATTRIBUTE_IDENTIFIER" do 50 lineno = @scanner.lineno 51 @scanner.scan("identifier") do |sym, val| 52 assert_equal :V_ATTRIBUTE_IDENTIFIER, sym 53 assert_equal "identifier", val 54 end 55 assert_equal lineno, @scanner.lineno 69 56 end 70 57 71 must "assert V_ISO8601_TIME_CONSTRAINT_PATTERN scanner is properly working" do72 parser = OpenEHR::ADL::Scanner::CADL::V_ISO8601_TIME_CONSTRAINT_PATTERN.new73 assert_instance_of OpenEHR::ADL::Scanner::CADL::V_ISO8601_TIME_CONSTRAINT_PATTERN,parser74 result = parser.parse('hh:mm:ss:??')75 assert_instance_of Yaparc::Result::OK, result58 must "assert CADLScanner scanner scan reserved words" do 59 lineno = @scanner.lineno 60 @scanner.scan("then") do |sym, val| 61 assert_equal :SYM_THEN, sym 62 end 76 63 end 77 64 78 must "assert reserved words in dADL scanner is properly working" do 79 parser = OpenEHR::ADL::Scanner::DADL::RootScanner.new 80 result = parser.parse('then') 81 assert_instance_of Yaparc::Result::OK, result 82 result = parser.parse('infinity') 83 assert_instance_of Yaparc::Result::OK, result 84 assert_equal [:SYM_INFINITY, :SYM_INFINITY], result.value 65 must "assert CADLScanner scanner scan V_QUALIFIED_TERM_CODE_REF" do 66 @scanner.scan("[ICD10AM(1998)::F23]") do |sym, val| 67 assert_equal :V_QUALIFIED_TERM_CODE_REF,sym 68 assert_equal "ICD10AM(1998)::F23",val 69 end 85 70 end 86 71 87 must "assert reserved words in cADL scanner is properly working" do 88 parser = OpenEHR::ADL::Scanner::CADL::RootScanner.new 89 assert_instance_of OpenEHR::ADL::Scanner::CADL::RootScanner,parser 90 result = parser.parse('PT1M') 91 assert_instance_of Yaparc::Result::OK, result 92 assert_equal [:V_ISO8601_DURATION, "PT1M"], result.value 93 result = parser.parse('PYMWDTHMS') 94 assert_instance_of Yaparc::Result::OK, result 95 assert_equal [:V_ISO8601_DURATION, "PYMWDTHMS"], result.value 72 must "assert CADLScanner scanner scan V_ISO8601_DURATION" do 73 @scanner.scan("PT1M") do |sym, val| 74 assert_equal :V_ISO8601_DURATION,sym 75 assert_equal "PT1M",val 76 end 77 end 78 end 79 80 class DADLScannerTest < Test::Unit::TestCase 81 def setup 82 @scanner = OpenEHR::ADL::Scanner::DADLScanner.new([:dadl], "filename") 96 83 end 97 84 98 must "assert other reserved words in cADL scanner is properly working" do 99 parser = OpenEHR::ADL::Scanner::CADL::RootScanner.new 100 result = parser.parse('then') 101 assert_instance_of Yaparc::Result::OK, result 102 result = parser.parse('cardinality') 103 assert_instance_of Yaparc::Result::OK, result 104 assert_equal [:SYM_CARDINALITY, :SYM_CARDINALITY], result.value 105 result = parser.parse('ordered') 106 assert_instance_of Yaparc::Result::OK, result 107 assert_equal "", result.input 108 assert_equal [:SYM_ORDERED, :SYM_ORDERED], result.value 85 must "assert DADLScanner scanner scan V_QUALIFIED_TERM_CODE_REF" do 86 @scanner.scan("[ICD10AM(1998)::F23]") do |sym, val| 87 assert_equal :V_QUALIFIED_TERM_CODE_REF,sym 88 assert_equal "ICD10AM(1998)::F23",val 89 end 90 end 91 92 must "assert DADLScanner scanner scan V_ISO8601_EXTENDED_DATE" do 93 @scanner.scan("2005-10-10") do |sym, val| 94 assert_equal :V_ISO8601_EXTENDED_DATE,sym 95 assert_equal "2005-10-10",val 96 end 97 end 98 99 must "assert DADLScanner scanner scan V_STRING" do 100 @scanner.scan("\"string\"") do |sym, val| 101 assert_equal :V_STRING,sym 102 assert_equal "string",val 103 end 109 104 end 110 105 end
Note:
See TracChangeset
for help on using the changeset viewer.