Ignore:
Timestamp:
Oct 15, 2009, 7:28:12 AM (15 years ago)
Author:
Tatsukawa, Akimichi
Message:

refactoring scanner for regex

File:
1 edited

Legend:

Unmodified
Added
Removed
  • ruby/trunk/lib/adl_parser/lib/adl_scanner.rb

    r318 r320  
    5252          'false' => :SYM_FALSE, # [Ff][Aa][Ll][Ss][Ee] -- -> SYM_FALSE
    5353          'infinity' => :SYM_INFINITY # [Ii][Nn][Ff][Ii][Nn][Ii][Tt][Yy] -- -> SYM_INFINITY
     54        }
     55        REGEX_PATTERN = {
     56          :V_ISO8601_DURATION => /\AP([0-9]+[yY])?([0-9]+[mM])?([0-9]+[wW])?([0-9]+[dD])?T([0-9]+[hH])?([0-9]+[mM])?([0-9]+[sS])?|\AP([0-9]+[yY])?([0-9]+[mM])?([0-9]+[wW])?([0-9]+[dD])?/   #V_ISO8601_DURATION PnYnMnWnDTnnHnnMnnS
    5457        }
    5558
     
    203206              when /\A[a-z]+:\/\/[^<>|\\{}^~"\[\] ]*/ #V_URI
    204207                yield :V_URI, $&
    205               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 PnYnMnWnDTnnHnnMnnS
     208              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 PnYnMnWnDTnnHnnMnnS
     209                yield :V_ISO8601_DURATION, $&
     210              when /\AP([0-9]+[yY])?([0-9]+[mM])?([0-9]+[wW])?([0-9]+[dD])?/   #V_ISO8601_DURATION PnYnMnWnDTnnHnnMnnS
    206211                yield :V_ISO8601_DURATION, $&
    207212              when /\A\S/ #UTF8CHAR
     
    364369                  @in_interval = false
    365370                else
    366                   #          @in_interval = false
    367371                  @in_interval = true
    368372                end
     
    517521              when /\A\*/   # *
    518522                yield :Star_code, :Star_code
    519               when /\A\//   # /
    520                 yield :Slash_code, :Slash_code
    521523              when /\A\^/   # ^
    522524                yield :Caret_code, :Caret_code
     
    539541              when /\A\)/   # )
    540542                yield :Right_parenthesis_code, :Right_parenthesis_code
    541               when /\A\{\// #V_REGEXP
    542                 if @adl_type.last != :regexp
    543                   @in_regexp = true
    544                   @adl_type.push(:regexp)
    545                   yield :START_REGEXP_BLOCK, :START_REGEXP_BLOCK
    546                 else
    547                   raise
    548                 end
     543              when /\A\//   # /
     544#                yield :Slash_code, :Slash_code
     545#              when /\A\// #V_REGEXP /
     546                assert_at(__FILE__,__LINE__){@adl_type.last != :regexp}
     547                #@in_regexp = true
     548                @adl_type.push(:regexp)
     549#                yield :START_REGEXP_BLOCK, :START_REGEXP_BLOCK
     550                yield :Slash_code, :Slash_code
     551
     552#               when /\A\{\// #V_REGEXP {/
     553#                 if @adl_type.last != :regexp
     554#                   @in_regexp = true
     555#                   @adl_type.push(:regexp)
     556#                   yield :START_REGEXP_BLOCK, :START_REGEXP_BLOCK
     557#                 else
     558#                   assert_at(__FILE__,__LINE__){false}
     559#                 end
    549560              when /\A\{/   # {
    550561                @adl_type.push(:cadl)
     
    563574                yield :Question_mark_code, :Question_mark_code
    564575              when /\A\|/   # |
    565                 @@logger.debug("CADLScanner#scan: @in_interval = #{@in_interval} at #{@filename}:#{@lineno}")
    566576                if @in_interval
    567577                  @in_interval = false
    568578                else
    569                   #          @in_interval = false
    570579                  @in_interval = true
    571580                end
     581                @@logger.debug("CADLScanner#scan: @in_interval = #{@in_interval} at #{@filename}:#{@lineno}")
    572582                @@logger.debug("CADLScanner#scan: SYM_INTERVAL_DELIM at #{@filename}:#{@lineno}")
    573583                yield :SYM_INTERVAL_DELIM, :SYM_INTERVAL_DELIM
     
    588598              when /\A[A-Z][a-zA-Z0-9_]*<[a-zA-Z0-9,_<>]+>/   #V_GENERIC_TYPE_IDENTIFIER
    589599                yield :V_GENERIC_TYPE_IDENTIFIER, $&
    590               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]/
     600              when /\A[yY][yY][yY][yY]-[mM?X][mM?X]-[dD?X][dD?X][Tt][hH?X][hH?X]:[mM?X][mM?X]:[sS?X][sS?X]/
    591601                yield :V_ISO8601_DATE_TIME_CONSTRAINT_PATTERN, $&
    592602              when /\A[yY][yY][yY][yY]-[mM?X][mM?X]-[dD?X][dD?X]/
     
    594604              when /\A[hH][hH]:[mM?X][mM?X]:[sS?X][sS?X]/
    595605                yield :V_ISO8601_TIME_CONSTRAINT_PATTERN, $&
    596 #              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
    597 #                yield :V_ISO8601_DURATION, $&
    598               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
    599                 yield :V_ISO8601_DURATION, $&
    600               when /\AP[yY]?[mM]?[wW]?[dD]?(T[hH]?[mM]?[sS]?)?/   #V_ISO8601_DURATION_CONSTRAINT_PATTERN
     606              when /\AP[yY]?[mM]?[wW]?[dD]?T[hH]?[mM]?[sS]?/   #V_ISO8601_DURATION_CONSTRAINT_PATTERN
     607                if $&.length == 2
     608                  case data
     609                  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 PnYnMnWnDTnnHnnMnnS
     610                    yield :V_ISO8601_DURATION, $&
     611                  else
     612                    yield :V_ISO8601_DURATION_CONSTRAINT_PATTERN, $&
     613                  end
     614                else
     615                  yield :V_ISO8601_DURATION_CONSTRAINT_PATTERN, $&
     616                end
     617              when /\AP[yY]?[mM]?[wW]?[dD]?/   #V_ISO8601_DURATION_CONSTRAINT_PATTERN
     618                if $&.length == 1
     619                  case data
     620                  when /\AP([0-9]+[yY])?([0-9]+[mM])?([0-9]+[wW])?([0-9]+[dD])?/   #V_ISO8601_DURATION PnYnMnWnDTnnHnnMnnS
     621                    yield :V_ISO8601_DURATION, $&
     622                  else
     623                    yield :V_ISO8601_DURATION_CONSTRAINT_PATTERN, $&
     624                  end
     625                else
     626                  yield :V_ISO8601_DURATION_CONSTRAINT_PATTERN, $&
     627                end
     628              when /\AP[yY]?[mM]?[wW]?[dD]?/   #V_ISO8601_DURATION_CONSTRAINT_PATTERN
    601629                yield :V_ISO8601_DURATION_CONSTRAINT_PATTERN, $&
    602               when /\A[a-z][a-zA-Z0-9_]*/
     630              when /\A[a-zA-Z][a-zA-Z0-9_]*/
    603631                word = $&.dup
    604632                if RESERVED[word.downcase]
     633                  @@logger.debug("CADLScanner#scan: RESERVED = #{word} at #{@filename}:#{@lineno}")
    605634                  yield RESERVED[word.downcase], RESERVED[word.downcase]
    606635                else
     
    621650              when /\Aa[ct][0-9.]+/   #V_LOCAL_CODE
    622651                yield :V_LOCAL_CODE, $&
    623               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-]-
     652              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})?/    #V_ISO8601_EXTENDED_DATE_TIME YYYY-MM-DDThh:mm:ss[,sss][Z|+/- -n-n-n-n-]-
     653                yield :V_ISO8601_EXTENDED_DATE_TIME, $&
     654              when /\A[0-9]{4}-[0-1][0-9]-[0-3][0-9]T[0-2][0-9]:[0-6][0-9](Z|[+-][0-9]{4})?/
     655                yield :V_ISO8601_EXTENDED_DATE_TIME, $&
     656              when /\A[[0-9]{4}-[0-1][0-9]-[0-3][0-9]T[0-2][0-9](Z|[+-][0-9]{4})?/
    624657                yield :V_ISO8601_EXTENDED_DATE_TIME, $&
    625658              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]
    626659                yield :V_ISO8601_EXTENDED_TIME, $&
    627               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
     660              when /\A[0-9]{4}-[0-1][0-9]-[0-3][0-9]/   #V_ISO8601_EXTENDED_DATE YYYY-MM-DD
     661                yield :V_ISO8601_EXTENDED_DATE, $&
     662              when /\A[0-9]{4}-[0-1][0-9]/   #V_ISO8601_EXTENDED_DATE YYYY-MM-DD
    628663                yield :V_ISO8601_EXTENDED_DATE, $&
    629664              when /\A"((?:[^"\\]+|\\.)*)"/ #V_STRING
     
    686721
    687722        def scan(data)
    688           @@logger.debug("#{__FILE__}:#{__LINE__}: Entering scan_regexp at #{@filename}:#{@lineno}: data = #{data.inspect}")
     723          @@logger.debug("#{__FILE__}:#{__LINE__}: Entering RegexScanner::scan at #{@filename}:#{@lineno}: data = #{data.inspect}")
    689724          until data.nil?  do
    690725            case @adl_type.last
    691726            when :regexp
    692727              case data
    693               when /\A\/\}/ #V_REGEXP
    694                 if @adl_type.last == :regexp
    695                   @in_regexp = false
    696                   @adl_type.pop
    697                   yield :END_REGEXP_BLOCK, :END_REGEXP_BLOCK
    698                 else
    699                   raise
    700                 end
    701               when /\A(.*)(\/\})/ #V_REGEXP
     728              when /\A\// #V_REGEXP /
     729                assert_at(__FILE__,__LINE__){@adl_type.last == :regexp}
     730                #@in_regexp = false
     731                @adl_type.pop
     732                yield :END_REGEXP_BLOCK, :END_REGEXP_BLOCK
     733#               when /\A\/\}/ #V_REGEXP /
     734#                 if @adl_type.last == :regexp
     735#                   @in_regexp = false
     736#                   @adl_type.pop
     737#                   yield :END_REGEXP_BLOCK, :END_REGEXP_BLOCK
     738#                 else
     739#                   raise
     740#                 end
     741#              when /\A(.*)(\/\})/ #V_REGEXP /}
     742              when /\A([^\/]+)/ #V_REGEXP
    702743                yield :REGEXP_BODY, $1
    703                 if @adl_type.last == :regexp
    704                   @in_regexp = false
    705                   @adl_type.pop
    706                   yield :END_REGEXP_BLOCK, :END_REGEXP_BLOCK
    707                 else
    708                   raise
    709                 end
    710               else
    711                 raise data
     744#              else
     745#                raise "should not happen at #{data}"
    712746              end
    713747              data = $' # variable $' receives the string after the match
     
    734768              end
    735769            else
    736               raise
     770              raise 
    737771            end
    738772          end
Note: See TracChangeset for help on using the changeset viewer.