Changeset 283 for ruby/trunk/lib/adl_parser/lib/parser.y
- Timestamp:
- Sep 20, 2009, 1:20:48 PM (15 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
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
Note:
See TracChangeset
for help on using the changeset viewer.