/[suikacvs]/markup/html/whatpm/Whatpm/CSS/Tokenizer.pm
Suika

Diff of /markup/html/whatpm/Whatpm/CSS/Tokenizer.pm

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.18 by wakaba, Sun Jan 20 06:15:20 2008 UTC revision 1.19 by wakaba, Sat Jan 26 09:30:47 2008 UTC
# Line 103  sub new ($) { Line 103  sub new ($) {
103  sub init ($) {  sub init ($) {
104    my $self = shift;    my $self = shift;
105    $self->{state} = BEFORE_TOKEN_STATE;    $self->{state} = BEFORE_TOKEN_STATE;
106    $self->{c} = $self->{get_char}->();    $self->{c} = $self->{get_char}->($self);
107    #$self->{t} = {type => token-type, value => value, number => number};    #$self->{t} = {type => token-type, value => value, number => number};
108  } # init  } # init
109    
# Line 130  sub get_next_token ($) { Line 130  sub get_next_token ($) {
130          $self->{t} = {type => IDENT_TOKEN, value => '-', hyphen => 1,          $self->{t} = {type => IDENT_TOKEN, value => '-', hyphen => 1,
131                        line => $self->{line}, column => $self->{column}};                        line => $self->{line}, column => $self->{column}};
132          $self->{state} = BEFORE_NMSTART_STATE;          $self->{state} = BEFORE_NMSTART_STATE;
133          $self->{c} = $self->{get_char}->();          $self->{c} = $self->{get_char}->($self);
134          redo A;          redo A;
135        } elsif ($self->{c} == 0x0055 or $self->{c} == 0x0075) { # U or u        } elsif ($self->{c} == 0x0055 or $self->{c} == 0x0075) { # U or u
136          $self->{t} = {type => IDENT_TOKEN, value => chr $self->{c},          $self->{t} = {type => IDENT_TOKEN, value => chr $self->{c},
137                        line => $self->{line}, column => $self->{column}};                        line => $self->{line}, column => $self->{column}};
138          $self->{c} = $self->{get_char}->();          $self->{c} = $self->{get_char}->($self);
139          if ($self->{c} == 0x002B) { # +          if ($self->{c} == 0x002B) { # +
140            my ($l, $c) = ($self->{line}, $self->{column});            my ($l, $c) = ($self->{line}, $self->{column});
141            $self->{c} = $self->{get_char}->();            $self->{c} = $self->{get_char}->($self);
142            if ((0x0030 <= $self->{c} and $self->{c} <= 0x0039) or # 0..9            if ((0x0030 <= $self->{c} and $self->{c} <= 0x0039) or # 0..9
143                (0x0041 <= $self->{c} and $self->{c} <= 0x0046) or # A..F                (0x0041 <= $self->{c} and $self->{c} <= 0x0046) or # A..F
144                (0x0061 <= $self->{c} and $self->{c} <= 0x0066) or # a..f                (0x0061 <= $self->{c} and $self->{c} <= 0x0066) or # a..f
145                $self->{c} == 0x003F) { # ?                $self->{c} == 0x003F) { # ?
146              $self->{t}->{value} = chr $self->{c};              $self->{t}->{value} = chr $self->{c};
147              $self->{t}->{type} = UNICODE_RANGE_TOKEN;              $self->{t}->{type} = UNICODE_RANGE_TOKEN;
148              $self->{c} = $self->{get_char}->();              $self->{c} = $self->{get_char}->($self);
149              C: for (2..6) {              C: for (2..6) {
150                if ((0x0030 <= $self->{c} and $self->{c} <= 0x0039) or # 0..9                if ((0x0030 <= $self->{c} and $self->{c} <= 0x0039) or # 0..9
151                    (0x0041 <= $self->{c} and $self->{c} <= 0x0046) or # A..F                    (0x0041 <= $self->{c} and $self->{c} <= 0x0046) or # A..F
152                    (0x0061 <= $self->{c} and $self->{c} <= 0x0066) or # a..f                    (0x0061 <= $self->{c} and $self->{c} <= 0x0066) or # a..f
153                    $self->{c} == 0x003F) { # ?                    $self->{c} == 0x003F) { # ?
154                  $self->{t}->{value} .= chr $self->{c};                  $self->{t}->{value} .= chr $self->{c};
155                  $self->{c} = $self->{get_char}->();                  $self->{c} = $self->{get_char}->($self);
156                } else {                } else {
157                  last C;                  last C;
158                }                }
159              } # C              } # C
160    
161              if ($self->{c} == 0x002D) { # -              if ($self->{c} == 0x002D) { # -
162                $self->{c} = $self->{get_char}->();                $self->{c} = $self->{get_char}->($self);
163                if ((0x0030 <= $self->{c} and $self->{c} <= 0x0039) or # 0..9                if ((0x0030 <= $self->{c} and $self->{c} <= 0x0039) or # 0..9
164                    (0x0041 <= $self->{c} and $self->{c} <= 0x0046) or # A..F                    (0x0041 <= $self->{c} and $self->{c} <= 0x0046) or # A..F
165                    (0x0061 <= $self->{c} and $self->{c} <= 0x0066)) { # a..f                    (0x0061 <= $self->{c} and $self->{c} <= 0x0066)) { # a..f
166                  $self->{t}->{value} .= '-' . chr $self->{c};                  $self->{t}->{value} .= '-' . chr $self->{c};
167                  $self->{c} = $self->{get_char}->();                  $self->{c} = $self->{get_char}->($self);
168                  C: for (2..6) {                  C: for (2..6) {
169                    if ((0x0030 <= $self->{c} and $self->{c} <= 0x0039) or # 0..9                    if ((0x0030 <= $self->{c} and $self->{c} <= 0x0039) or # 0..9
170                        (0x0041 <= $self->{c} and $self->{c} <= 0x0046) or # A..F                        (0x0041 <= $self->{c} and $self->{c} <= 0x0046) or # A..F
171                        (0x0061 <= $self->{c} and $self->{c} <= 0x0066)) { # a..f                        (0x0061 <= $self->{c} and $self->{c} <= 0x0066)) { # a..f
172                      $self->{t}->{value} .= chr $self->{c};                      $self->{t}->{value} .= chr $self->{c};
173                      $self->{c} = $self->{get_char}->();                      $self->{c} = $self->{get_char}->($self);
174                    } else {                    } else {
175                      last C;                      last C;
176                    }                    }
# Line 214  sub get_next_token ($) { Line 214  sub get_next_token ($) {
214          $self->{t} = {type => IDENT_TOKEN, value => chr $self->{c},          $self->{t} = {type => IDENT_TOKEN, value => chr $self->{c},
215                        line => $self->{line}, column => $self->{column}};                        line => $self->{line}, column => $self->{column}};
216          $self->{state} = NAME_STATE;          $self->{state} = NAME_STATE;
217          $self->{c} = $self->{get_char}->();          $self->{c} = $self->{get_char}->($self);
218          redo A;          redo A;
219        } elsif ($self->{c} == 0x005C) { # \        } elsif ($self->{c} == 0x005C) { # \
220          ## NOTE: |nmstart| in |ident| in |IDENT|          ## NOTE: |nmstart| in |ident| in |IDENT|
221          $self->{t} = {type => IDENT_TOKEN, value => '',          $self->{t} = {type => IDENT_TOKEN, value => '',
222                        line => $self->{line}, column => $self->{column}};                        line => $self->{line}, column => $self->{column}};
223          $self->{state} = ESCAPE_OPEN_STATE; $q = 0;          $self->{state} = ESCAPE_OPEN_STATE; $q = 0;
224          $self->{c} = $self->{get_char}->();          $self->{c} = $self->{get_char}->($self);
225          redo A;          redo A;
226        } elsif ($self->{c} == 0x0040) { # @        } elsif ($self->{c} == 0x0040) { # @
227          ## NOTE: |@| in |ATKEYWORD|          ## NOTE: |@| in |ATKEYWORD|
228          $self->{t} = {type => ATKEYWORD_TOKEN, value => '',          $self->{t} = {type => ATKEYWORD_TOKEN, value => '',
229                        line => $self->{line}, column => $self->{column}};                        line => $self->{line}, column => $self->{column}};
230          $self->{state} = AFTER_AT_STATE;          $self->{state} = AFTER_AT_STATE;
231          $self->{c} = $self->{get_char}->();          $self->{c} = $self->{get_char}->($self);
232          redo A;          redo A;
233        } elsif ($self->{c} == 0x0022 or $self->{c} == 0x0027) { # " or '        } elsif ($self->{c} == 0x0022 or $self->{c} == 0x0027) { # " or '
234          $self->{t} = {type => STRING_TOKEN, value => '',          $self->{t} = {type => STRING_TOKEN, value => '',
235                        line => $self->{line}, column => $self->{column}};                        line => $self->{line}, column => $self->{column}};
236          $self->{state} = STRING_STATE; $q = $self->{c};          $self->{state} = STRING_STATE; $q = $self->{c};
237          $self->{c} = $self->{get_char}->();          $self->{c} = $self->{get_char}->($self);
238          redo A;          redo A;
239        } elsif ($self->{c} == 0x0023) { # #        } elsif ($self->{c} == 0x0023) { # #
240          ## NOTE: |#| in |HASH|.          ## NOTE: |#| in |HASH|.
241          $self->{t} = {type => HASH_TOKEN, value => '',          $self->{t} = {type => HASH_TOKEN, value => '',
242                        line => $self->{line}, column => $self->{column}};                        line => $self->{line}, column => $self->{column}};
243          $self->{state} = HASH_OPEN_STATE;          $self->{state} = HASH_OPEN_STATE;
244          $self->{c} = $self->{get_char}->();          $self->{c} = $self->{get_char}->($self);
245          redo A;          redo A;
246        } elsif (0x0030 <= $self->{c} and $self->{c} <= 0x0039) { # 0..9        } elsif (0x0030 <= $self->{c} and $self->{c} <= 0x0039) { # 0..9
247          ## NOTE: |num|.          ## NOTE: |num|.
248          $self->{t} = {type => NUMBER_TOKEN, value => chr $self->{c},          $self->{t} = {type => NUMBER_TOKEN, value => chr $self->{c},
249                        line => $self->{line}, column => $self->{column}};                        line => $self->{line}, column => $self->{column}};
250          $self->{state} = NUMBER_STATE;          $self->{state} = NUMBER_STATE;
251          $self->{c} = $self->{get_char}->();          $self->{c} = $self->{get_char}->($self);
252          redo A;          redo A;
253        } elsif ($self->{c} == 0x002E) { # .        } elsif ($self->{c} == 0x002E) { # .
254          ## NOTE: |num|.          ## NOTE: |num|.
255          $self->{t} = {type => NUMBER_TOKEN, value => '0',          $self->{t} = {type => NUMBER_TOKEN, value => '0',
256                        line => $self->{line}, column => $self->{column}};                        line => $self->{line}, column => $self->{column}};
257          $self->{state} = NUMBER_FRACTION_STATE;          $self->{state} = NUMBER_FRACTION_STATE;
258          $self->{c} = $self->{get_char}->();          $self->{c} = $self->{get_char}->($self);
259          redo A;          redo A;
260        } elsif ($self->{c} == 0x002F) { # /        } elsif ($self->{c} == 0x002F) { # /
261          my ($l, $c) = ($self->{line}, $self->{column});          my ($l, $c) = ($self->{line}, $self->{column});
262          $self->{c} = $self->{get_char}->();          $self->{c} = $self->{get_char}->($self);
263          if ($self->{c} == 0x002A) { # *          if ($self->{c} == 0x002A) { # *
264            C: {            C: {
265              $self->{c} = $self->{get_char}->();              $self->{c} = $self->{get_char}->($self);
266              if ($self->{c} == 0x002A) { # *              if ($self->{c} == 0x002A) { # *
267                D: {                D: {
268                  $self->{c} = $self->{get_char}->();                  $self->{c} = $self->{get_char}->($self);
269                  if ($self->{c} == 0x002F) { # /                  if ($self->{c} == 0x002F) { # /
270                    #                    #
271                  } elsif ($self->{c} == 0x002A) { # *                  } elsif ($self->{c} == 0x002A) { # *
# Line 285  sub get_next_token ($) { Line 285  sub get_next_token ($) {
285            } # C            } # C
286    
287            # stay in the state.            # stay in the state.
288            $self->{c} = $self->{get_char}->();            $self->{c} = $self->{get_char}->($self);
289            redo A;            redo A;
290          } else {          } else {
291            # stay in the state.            # stay in the state.
# Line 296  sub get_next_token ($) { Line 296  sub get_next_token ($) {
296        } elsif ($self->{c} == 0x003C) { # <        } elsif ($self->{c} == 0x003C) { # <
297          my ($l, $c) = ($self->{line}, $self->{column});          my ($l, $c) = ($self->{line}, $self->{column});
298          ## NOTE: |CDO|          ## NOTE: |CDO|
299          $self->{c} = $self->{get_char}->();          $self->{c} = $self->{get_char}->($self);
300          if ($self->{c} == 0x0021) { # !          if ($self->{c} == 0x0021) { # !
301            $self->{c} = $self->{get_char}->();            $self->{c} = $self->{get_char}->($self);
302            if ($self->{c} == 0x002D) { # -            if ($self->{c} == 0x002D) { # -
303              $self->{c} = $self->{get_char}->();              $self->{c} = $self->{get_char}->($self);
304              if ($self->{c} == 0x002D) { # -              if ($self->{c} == 0x002D) { # -
305                $self->{state} = BEFORE_TOKEN_STATE;                $self->{state} = BEFORE_TOKEN_STATE;
306                $self->{c} = $self->{get_char}->();                $self->{c} = $self->{get_char}->($self);
307                return {type => CDO_TOKEN, line => $l, column => $c};                return {type => CDO_TOKEN, line => $l, column => $c};
308                #redo A;                #redo A;
309              } else {              } else {
# Line 362  sub get_next_token ($) { Line 362  sub get_next_token ($) {
362                 }->{$self->{c}}) {                 }->{$self->{c}}) {
363          my ($l, $c) = ($self->{line}, $self->{column});          my ($l, $c) = ($self->{line}, $self->{column});
364          W: {          W: {
365            $self->{c} = $self->{get_char}->();            $self->{c} = $self->{get_char}->($self);
366            if ({            if ({
367                  0x0020 => 1, # SP                  0x0020 => 1, # SP
368                  0x0009 => 1, # \t                  0x0009 => 1, # \t
# Line 379  sub get_next_token ($) { Line 379  sub get_next_token ($) {
379                             }->{$self->{c}}) {                             }->{$self->{c}}) {
380              my ($l, $c) = ($self->{line}, $self->{column});              my ($l, $c) = ($self->{line}, $self->{column});
381              # stay in the state              # stay in the state
382              $self->{c} = $self->{get_char}->();              $self->{c} = $self->{get_char}->($self);
383              return {type => $v, line => $l, column => $c};              return {type => $v, line => $l, column => $c};
384              #redo A;              #redo A;
385            } else {            } else {
# Line 397  sub get_next_token ($) { Line 397  sub get_next_token ($) {
397                         }->{$self->{c}}) {                         }->{$self->{c}}) {
398          my ($line, $column) = ($self->{line}, $self->{column});          my ($line, $column) = ($self->{line}, $self->{column});
399          my $c = $self->{c};          my $c = $self->{c};
400          $self->{c} = $self->{get_char}->();          $self->{c} = $self->{get_char}->($self);
401          if ($self->{c} == 0x003D) { # =          if ($self->{c} == 0x003D) { # =
402            # stay in the state            # stay in the state
403            $self->{c} = $self->{get_char}->();            $self->{c} = $self->{get_char}->($self);
404            return {type => $v, line => $line, column => $column};            return {type => $v, line => $line, column => $column};
405            #redo A;            #redo A;
406          } elsif ($v = {          } elsif ($v = {
# Line 421  sub get_next_token ($) { Line 421  sub get_next_token ($) {
421        } elsif ($self->{c} == 0x002B) { # +        } elsif ($self->{c} == 0x002B) { # +
422          my ($l, $c) = ($self->{line}, $self->{column});          my ($l, $c) = ($self->{line}, $self->{column});
423          # stay in the state          # stay in the state
424          $self->{c} = $self->{get_char}->();          $self->{c} = $self->{get_char}->($self);
425          return {type => PLUS_TOKEN, line => $l, column => $c};          return {type => PLUS_TOKEN, line => $l, column => $c};
426          #redo A;          #redo A;
427        } elsif ($self->{c} == 0x003E) { # >        } elsif ($self->{c} == 0x003E) { # >
428          my ($l, $c) = ($self->{line}, $self->{column});          my ($l, $c) = ($self->{line}, $self->{column});
429          # stay in the state          # stay in the state
430          $self->{c} = $self->{get_char}->();          $self->{c} = $self->{get_char}->($self);
431          return {type => GREATER_TOKEN, line => $l, column => $c};          return {type => GREATER_TOKEN, line => $l, column => $c};
432          #redo A;          #redo A;
433        } elsif ($self->{c} == 0x002C) { # ,        } elsif ($self->{c} == 0x002C) { # ,
434          my ($l, $c) = ($self->{line}, $self->{column});          my ($l, $c) = ($self->{line}, $self->{column});
435          # stay in the state          # stay in the state
436          $self->{c} = $self->{get_char}->();          $self->{c} = $self->{get_char}->($self);
437          return {type => COMMA_TOKEN, line => $l, column => $c};          return {type => COMMA_TOKEN, line => $l, column => $c};
438          #redo A;          #redo A;
439        } elsif ($self->{c} == 0x007E) { # ~        } elsif ($self->{c} == 0x007E) { # ~
440          my ($l, $c) = ($self->{line}, $self->{column});          my ($l, $c) = ($self->{line}, $self->{column});
441          $self->{c} = $self->{get_char}->();          $self->{c} = $self->{get_char}->($self);
442          if ($self->{c} == 0x003D) { # =          if ($self->{c} == 0x003D) { # =
443            # stay in the state            # stay in the state
444            $self->{c} = $self->{get_char}->();            $self->{c} = $self->{get_char}->($self);
445            return {type => INCLUDES_TOKEN, line => $l, column => $c};            return {type => INCLUDES_TOKEN, line => $l, column => $c};
446            #redo A;            #redo A;
447          } else {          } else {
# Line 452  sub get_next_token ($) { Line 452  sub get_next_token ($) {
452          }          }
453        } elsif ($self->{c} == -1) {        } elsif ($self->{c} == -1) {
454          # stay in the state          # stay in the state
455          $self->{c} = $self->{get_char}->();          $self->{c} = $self->{get_char}->($self);
456          return {type => EOF_TOKEN,          return {type => EOF_TOKEN,
457                  line => $self->{line}, column => $self->{column}};                  line => $self->{line}, column => $self->{column}};
458          #redo A;          #redo A;
# Line 460  sub get_next_token ($) { Line 460  sub get_next_token ($) {
460          # stay in the state          # stay in the state
461          $self->{t} = {type => DELIM_TOKEN, value => chr $self->{c},          $self->{t} = {type => DELIM_TOKEN, value => chr $self->{c},
462                        line => $self->{line}, column => $self->{column}};                        line => $self->{line}, column => $self->{column}};
463          $self->{c} = $self->{get_char}->();          $self->{c} = $self->{get_char}->($self);
464          return $self->{t};          return $self->{t};
465          #redo A;          #redo A;
466        }        }
# Line 475  sub get_next_token ($) { Line 475  sub get_next_token ($) {
475          $self->{t}->{type} = DIMENSION_TOKEN          $self->{t}->{type} = DIMENSION_TOKEN
476              if $self->{t}->{type} == NUMBER_TOKEN;              if $self->{t}->{type} == NUMBER_TOKEN;
477          $self->{state} = NAME_STATE;          $self->{state} = NAME_STATE;
478          $self->{c} = $self->{get_char}->();          $self->{c} = $self->{get_char}->($self);
479          redo A;          redo A;
480        } elsif ($self->{c} == 0x005C) { # \        } elsif ($self->{c} == 0x005C) { # \
481          $self->{state} = ESCAPE_OPEN_STATE; $q = 0;          $self->{state} = ESCAPE_OPEN_STATE; $q = 0;
482          $self->{c} = $self->{get_char}->();          $self->{c} = $self->{get_char}->($self);
483          redo A;          redo A;
484        } elsif ($self->{c} == 0x002D) { # -        } elsif ($self->{c} == 0x002D) { # -
485          if ($self->{t}->{type} == IDENT_TOKEN) {          if ($self->{t}->{type} == IDENT_TOKEN) {
486            $self->{c} = $self->{get_char}->();            $self->{c} = $self->{get_char}->($self);
487            if ($self->{c} == 0x003E) { # >            if ($self->{c} == 0x003E) { # >
488              $self->{state} = BEFORE_TOKEN_STATE;              $self->{state} = BEFORE_TOKEN_STATE;
489              $self->{c} = $self->{get_char}->();              $self->{c} = $self->{get_char}->($self);
490              return {type => CDC_TOKEN,              return {type => CDC_TOKEN,
491                      line => $self->{t}->{line},                      line => $self->{t}->{line},
492                      column => $self->{t}->{column}};                      column => $self->{t}->{column}};
# Line 504  sub get_next_token ($) { Line 504  sub get_next_token ($) {
504            }            }
505          } elsif ($self->{t}->{type} == DIMENSION_TOKEN) {          } elsif ($self->{t}->{type} == DIMENSION_TOKEN) {
506            my ($l, $c) = ($self->{line}, $self->{column}); # second '-'            my ($l, $c) = ($self->{line}, $self->{column}); # second '-'
507            $self->{c} = $self->{get_char}->();            $self->{c} = $self->{get_char}->($self);
508            if ($self->{c} == 0x003E) { # >            if ($self->{c} == 0x003E) { # >
509              unshift @{$self->{token}}, {type => CDC_TOKEN};              unshift @{$self->{token}}, {type => CDC_TOKEN};
510              $self->{t}->{type} = NUMBER_TOKEN;              $self->{t}->{type} = NUMBER_TOKEN;
511              $self->{t}->{value} = '';              $self->{t}->{value} = '';
512              $self->{state} = BEFORE_TOKEN_STATE;              $self->{state} = BEFORE_TOKEN_STATE;
513              $self->{c} = $self->{get_char}->();              $self->{c} = $self->{get_char}->($self);
514              return $self->{t};              return $self->{t};
515              #redo A;              #redo A;
516            } else {            } else {
# Line 560  sub get_next_token ($) { Line 560  sub get_next_token ($) {
560            $self->{c} > 0x007F) { # nonascii            $self->{c} > 0x007F) { # nonascii
561          $self->{t}->{value} .= chr $self->{c};          $self->{t}->{value} .= chr $self->{c};
562          $self->{state} = NAME_STATE;          $self->{state} = NAME_STATE;
563          $self->{c} = $self->{get_char}->();          $self->{c} = $self->{get_char}->($self);
564          redo A;          redo A;
565        } elsif ($self->{c} == 0x002D) { # -        } elsif ($self->{c} == 0x002D) { # -
566          $self->{t}->{value} .= '-';          $self->{t}->{value} .= '-';
567          $self->{state} = AFTER_AT_HYPHEN_STATE;          $self->{state} = AFTER_AT_HYPHEN_STATE;
568          $self->{c} = $self->{get_char}->();          $self->{c} = $self->{get_char}->($self);
569          redo A;          redo A;
570        } elsif ($self->{c} == 0x005C) { # \        } elsif ($self->{c} == 0x005C) { # \
571          $self->{state} = ESCAPE_OPEN_STATE; $q = 0;          $self->{state} = ESCAPE_OPEN_STATE; $q = 0;
572          $self->{c} = $self->{get_char}->();          $self->{c} = $self->{get_char}->($self);
573          redo A;          redo A;
574        } else {        } else {
575          $self->{state} = BEFORE_TOKEN_STATE;          $self->{state} = BEFORE_TOKEN_STATE;
# Line 585  sub get_next_token ($) { Line 585  sub get_next_token ($) {
585            $self->{c} > 0x007F) { # nonascii            $self->{c} > 0x007F) { # nonascii
586          $self->{t}->{value} .= chr $self->{c};          $self->{t}->{value} .= chr $self->{c};
587          $self->{state} = NAME_STATE;          $self->{state} = NAME_STATE;
588          $self->{c} = $self->{get_char}->();          $self->{c} = $self->{get_char}->($self);
589          redo A;          redo A;
590        } elsif ($self->{c} == 0x002D) { # -        } elsif ($self->{c} == 0x002D) { # -
591          $self->{c} = $self->{get_char}->();          $self->{c} = $self->{get_char}->($self);
592          if ($self->{c} == 0x003E) { # >          if ($self->{c} == 0x003E) { # >
593            unshift @{$self->{token}}, {type => CDC_TOKEN};            unshift @{$self->{token}}, {type => CDC_TOKEN};
594            $self->{state} = BEFORE_TOKEN_STATE;            $self->{state} = BEFORE_TOKEN_STATE;
595            $self->{c} = $self->{get_char}->();            $self->{c} = $self->{get_char}->($self);
596            return {type => DELIM_TOKEN, value => '@'};            return {type => DELIM_TOKEN, value => '@'};
597            #redo A;            #redo A;
598          } else {          } else {
# Line 606  sub get_next_token ($) { Line 606  sub get_next_token ($) {
606        } elsif ($self->{c} == 0x005C) { # \        } elsif ($self->{c} == 0x005C) { # \
607          ## TODO: @-\{nl}          ## TODO: @-\{nl}
608          $self->{state} = ESCAPE_OPEN_STATE; $q = 0;          $self->{state} = ESCAPE_OPEN_STATE; $q = 0;
609          $self->{c} = $self->{get_char}->();          $self->{c} = $self->{get_char}->($self);
610          redo A;          redo A;
611        } else {        } else {
612          unshift @{$self->{token}}, {type => MINUS_TOKEN};          unshift @{$self->{token}}, {type => MINUS_TOKEN};
# Line 621  sub get_next_token ($) { Line 621  sub get_next_token ($) {
621          $self->{t}->{value} = '-';          $self->{t}->{value} = '-';
622          $self->{t}->{type} = DIMENSION_TOKEN;          $self->{t}->{type} = DIMENSION_TOKEN;
623          $self->{state} = BEFORE_NMSTART_STATE;          $self->{state} = BEFORE_NMSTART_STATE;
624          $self->{c} = $self->{get_char}->();          $self->{c} = $self->{get_char}->($self);
625          redo A;          redo A;
626        } elsif ((0x0041 <= $self->{c} and $self->{c} <= 0x005A) or # A..Z        } elsif ((0x0041 <= $self->{c} and $self->{c} <= 0x005A) or # A..Z
627                 (0x0061 <= $self->{c} and $self->{c} <= 0x007A) or # a..z                 (0x0061 <= $self->{c} and $self->{c} <= 0x007A) or # a..z
# Line 631  sub get_next_token ($) { Line 631  sub get_next_token ($) {
631          $self->{t}->{value} = chr $self->{c};          $self->{t}->{value} = chr $self->{c};
632          $self->{t}->{type} = DIMENSION_TOKEN;          $self->{t}->{type} = DIMENSION_TOKEN;
633          $self->{state} = NAME_STATE;          $self->{state} = NAME_STATE;
634          $self->{c} = $self->{get_char}->();          $self->{c} = $self->{get_char}->($self);
635          redo A;          redo A;
636        } elsif ($self->{c} == 0x005C) { # \        } elsif ($self->{c} == 0x005C) { # \
637          ## NOTE: |nmstart| in |ident| in |IDENT|          ## NOTE: |nmstart| in |ident| in |IDENT|
638          $self->{t}->{value} = '';          $self->{t}->{value} = '';
639          $self->{t}->{type} = DIMENSION_TOKEN;          $self->{t}->{type} = DIMENSION_TOKEN;
640          $self->{state} = ESCAPE_OPEN_STATE; $q = 0;          $self->{state} = ESCAPE_OPEN_STATE; $q = 0;
641          $self->{c} = $self->{get_char}->();          $self->{c} = $self->{get_char}->($self);
642          redo A;          redo A;
643        } elsif ($self->{c} == 0x0025) { # %        } elsif ($self->{c} == 0x0025) { # %
644          $self->{t}->{type} = PERCENTAGE_TOKEN;          $self->{t}->{type} = PERCENTAGE_TOKEN;
645          $self->{state} = BEFORE_TOKEN_STATE;          $self->{state} = BEFORE_TOKEN_STATE;
646          $self->{c} = $self->{get_char}->();          $self->{c} = $self->{get_char}->($self);
647          return $self->{t};          return $self->{t};
648          #redo A;          #redo A;
649        } else {        } else {
# Line 662  sub get_next_token ($) { Line 662  sub get_next_token ($) {
662            $self->{c} > 0x007F) { # nonascii            $self->{c} > 0x007F) { # nonascii
663          $self->{t}->{value} .= chr $self->{c};          $self->{t}->{value} .= chr $self->{c};
664          $self->{state} = NAME_STATE;          $self->{state} = NAME_STATE;
665          $self->{c} = $self->{get_char}->();          $self->{c} = $self->{get_char}->($self);
666          redo A;          redo A;
667        } elsif ($self->{c} == 0x005C) { # \        } elsif ($self->{c} == 0x005C) { # \
668          $self->{state} = ESCAPE_OPEN_STATE; $q = 0;          $self->{state} = ESCAPE_OPEN_STATE; $q = 0;
669          $self->{c} = $self->{get_char}->();          $self->{c} = $self->{get_char}->($self);
670          redo A;          redo A;
671        } else {        } else {
672          $self->{state} = BEFORE_TOKEN_STATE;          $self->{state} = BEFORE_TOKEN_STATE;
# Line 686  sub get_next_token ($) { Line 686  sub get_next_token ($) {
686            $self->{c} > 0x007F) { # nonascii            $self->{c} > 0x007F) { # nonascii
687          $self->{t}->{value} .= chr $self->{c};          $self->{t}->{value} .= chr $self->{c};
688          # stay in the state          # stay in the state
689          $self->{c} = $self->{get_char}->();          $self->{c} = $self->{get_char}->($self);
690          redo A;          redo A;
691        } elsif ($self->{c} == 0x005C) { # \        } elsif ($self->{c} == 0x005C) { # \
692          $self->{state} = ESCAPE_OPEN_STATE; $q = 0;          $self->{state} = ESCAPE_OPEN_STATE; $q = 0;
693          $self->{c} = $self->{get_char}->();          $self->{c} = $self->{get_char}->($self);
694          redo A;          redo A;
695        } elsif ($self->{c} == 0x0028 and # (        } elsif ($self->{c} == 0x0028 and # (
696                 $self->{t}->{type} == IDENT_TOKEN) { # (                 $self->{t}->{type} == IDENT_TOKEN) { # (
# Line 704  sub get_next_token ($) { Line 704  sub get_next_token ($) {
704                = $func_name eq 'url' ? URI_TOKEN : URI_PREFIX_TOKEN;                = $func_name eq 'url' ? URI_TOKEN : URI_PREFIX_TOKEN;
705            $self->{t}->{value} = '';            $self->{t}->{value} = '';
706            $self->{state} = URI_BEFORE_WSP_STATE;            $self->{state} = URI_BEFORE_WSP_STATE;
707            $self->{c} = $self->{get_char}->();            $self->{c} = $self->{get_char}->($self);
708            redo A;            redo A;
709          } else {          } else {
710            $self->{t}->{type} = FUNCTION_TOKEN;            $self->{t}->{type} = FUNCTION_TOKEN;
711            $self->{state} = BEFORE_TOKEN_STATE;            $self->{state} = BEFORE_TOKEN_STATE;
712            $self->{c} = $self->{get_char}->();            $self->{c} = $self->{get_char}->($self);
713            return $self->{t};            return $self->{t};
714            #redo A;            #redo A;
715          }          }
# Line 727  sub get_next_token ($) { Line 727  sub get_next_token ($) {
727                  0x000A => 1, # \n                  0x000A => 1, # \n
728                  0x000C => 1, # \f                  0x000C => 1, # \f
729               }->{$self->{c}}) {               }->{$self->{c}}) {
730          $self->{c} = $self->{get_char}->();          $self->{c} = $self->{get_char}->($self);
731        }        }
732        if ($self->{c} == -1) {        if ($self->{c} == -1) {
733          $self->{t}->{type} = {          $self->{t}->{type} = {
# Line 737  sub get_next_token ($) { Line 737  sub get_next_token ($) {
737              URI_PREFIX_INVALID_TOKEN, URI_PREFIX_INVALID_TOKEN,              URI_PREFIX_INVALID_TOKEN, URI_PREFIX_INVALID_TOKEN,
738          }->{$self->{t}->{type}};                  }->{$self->{t}->{type}};        
739          $self->{state} = BEFORE_TOKEN_STATE;          $self->{state} = BEFORE_TOKEN_STATE;
740          $self->{c} = $self->{get_char}->();          $self->{c} = $self->{get_char}->($self);
741          return $self->{t};          return $self->{t};
742          #redo A;          #redo A;
743        } elsif ($self->{c} < 0x0020 or $self->{c} == 0x0028) { # C0 or (        } elsif ($self->{c} < 0x0020 or $self->{c} == 0x0028) { # C0 or (
# Line 749  sub get_next_token ($) { Line 749  sub get_next_token ($) {
749              URI_PREFIX_INVALID_TOKEN, URI_PREFIX_INVALID_TOKEN,              URI_PREFIX_INVALID_TOKEN, URI_PREFIX_INVALID_TOKEN,
750          }->{$self->{t}->{type}};          }->{$self->{t}->{type}};
751          $self->{state} = URI_UNQUOTED_STATE;          $self->{state} = URI_UNQUOTED_STATE;
752          $self->{c} = $self->{get_char}->();          $self->{c} = $self->{get_char}->($self);
753          redo A;          redo A;
754        } elsif ($self->{c} == 0x0022 or $self->{c} == 0x0027) { # " or '        } elsif ($self->{c} == 0x0022 or $self->{c} == 0x0027) { # " or '
755          $self->{state} = STRING_STATE; $q = $self->{c};          $self->{state} = STRING_STATE; $q = $self->{c};
756          $self->{c} = $self->{get_char}->();          $self->{c} = $self->{get_char}->($self);
757          redo A;          redo A;
758        } elsif ($self->{c} == 0x0029) { # )        } elsif ($self->{c} == 0x0029) { # )
759          $self->{state} = BEFORE_TOKEN_STATE;          $self->{state} = BEFORE_TOKEN_STATE;
760          $self->{c} = $self->{get_char}->();          $self->{c} = $self->{get_char}->($self);
761          return $self->{t};          return $self->{t};
762          #redo A;          #redo A;
763        } elsif ($self->{c} == 0x005C) { # \        } elsif ($self->{c} == 0x005C) { # \
764          $self->{state} = ESCAPE_OPEN_STATE; $q = 1;          $self->{state} = ESCAPE_OPEN_STATE; $q = 1;
765          $self->{c} = $self->{get_char}->();          $self->{c} = $self->{get_char}->($self);
766          redo A;          redo A;
767        } else {        } else {
768          $self->{t}->{value} .= chr $self->{c};          $self->{t}->{value} .= chr $self->{c};
769          $self->{state} = URI_UNQUOTED_STATE;          $self->{state} = URI_UNQUOTED_STATE;
770          $self->{c} = $self->{get_char}->();          $self->{c} = $self->{get_char}->($self);
771          redo A;          redo A;
772        }        }
773      } elsif ($self->{state} == URI_UNQUOTED_STATE) {      } elsif ($self->{state} == URI_UNQUOTED_STATE) {
# Line 779  sub get_next_token ($) { Line 779  sub get_next_token ($) {
779             0x000C => 1, # \f             0x000C => 1, # \f
780            }->{$self->{c}}) {            }->{$self->{c}}) {
781          $self->{state} = URI_AFTER_WSP_STATE;          $self->{state} = URI_AFTER_WSP_STATE;
782          $self->{c} = $self->{get_char}->();          $self->{c} = $self->{get_char}->($self);
783          redo A;          redo A;
784        } elsif ($self->{c} == -1) {        } elsif ($self->{c} == -1) {
785          $self->{t}->{type} = {          $self->{t}->{type} = {
# Line 789  sub get_next_token ($) { Line 789  sub get_next_token ($) {
789              URI_PREFIX_INVALID_TOKEN, URI_PREFIX_INVALID_TOKEN,              URI_PREFIX_INVALID_TOKEN, URI_PREFIX_INVALID_TOKEN,
790          }->{$self->{t}->{type}};                  }->{$self->{t}->{type}};        
791          $self->{state} = BEFORE_TOKEN_STATE;          $self->{state} = BEFORE_TOKEN_STATE;
792          $self->{c} = $self->{get_char}->();          $self->{c} = $self->{get_char}->($self);
793          return $self->{t};          return $self->{t};
794          #redo A;          #redo A;
795        } elsif ($self->{c} < 0x0020 or {        } elsif ($self->{c} < 0x0020 or {
# Line 805  sub get_next_token ($) { Line 805  sub get_next_token ($) {
805              URI_PREFIX_INVALID_TOKEN, URI_PREFIX_INVALID_TOKEN,              URI_PREFIX_INVALID_TOKEN, URI_PREFIX_INVALID_TOKEN,
806          }->{$self->{t}->{type}};          }->{$self->{t}->{type}};
807          # stay in the state.          # stay in the state.
808          $self->{c} = $self->{get_char}->();          $self->{c} = $self->{get_char}->($self);
809          redo A;          redo A;
810        } elsif ($self->{c} == 0x0029) { # )        } elsif ($self->{c} == 0x0029) { # )
811          $self->{state} = BEFORE_TOKEN_STATE;          $self->{state} = BEFORE_TOKEN_STATE;
812          $self->{c} = $self->{get_char}->();          $self->{c} = $self->{get_char}->($self);
813          return $self->{t};          return $self->{t};
814          #redo A;          #redo A;
815        } elsif ($self->{c} == 0x005C) { # \        } elsif ($self->{c} == 0x005C) { # \
816          $self->{state} = ESCAPE_OPEN_STATE; $q = 1;          $self->{state} = ESCAPE_OPEN_STATE; $q = 1;
817          $self->{c} = $self->{get_char}->();          $self->{c} = $self->{get_char}->($self);
818          redo A;          redo A;
819        } else {        } else {
820          $self->{t}->{value} .= chr $self->{c};          $self->{t}->{value} .= chr $self->{c};
821          # stay in the state.          # stay in the state.
822          $self->{c} = $self->{get_char}->();          $self->{c} = $self->{get_char}->($self);
823          redo A;          redo A;
824        }        }
825      } elsif ($self->{state} == URI_AFTER_WSP_STATE) {      } elsif ($self->{state} == URI_AFTER_WSP_STATE) {
# Line 831  sub get_next_token ($) { Line 831  sub get_next_token ($) {
831             0x000C => 1, # \f             0x000C => 1, # \f
832            }->{$self->{c}}) {            }->{$self->{c}}) {
833          # stay in the state.          # stay in the state.
834          $self->{c} = $self->{get_char}->();          $self->{c} = $self->{get_char}->($self);
835          redo A;          redo A;
836        } elsif ($self->{c} == -1) {        } elsif ($self->{c} == -1) {
837          $self->{t}->{type} = {          $self->{t}->{type} = {
# Line 841  sub get_next_token ($) { Line 841  sub get_next_token ($) {
841              URI_PREFIX_INVALID_TOKEN, URI_PREFIX_INVALID_TOKEN,              URI_PREFIX_INVALID_TOKEN, URI_PREFIX_INVALID_TOKEN,
842          }->{$self->{t}->{type}};                  }->{$self->{t}->{type}};        
843          $self->{state} = BEFORE_TOKEN_STATE;          $self->{state} = BEFORE_TOKEN_STATE;
844          $self->{c} = $self->{get_char}->();          $self->{c} = $self->{get_char}->($self);
845          return $self->{t};          return $self->{t};
846          #redo A;          #redo A;
847        } elsif ($self->{c} == 0x0029) { # )        } elsif ($self->{c} == 0x0029) { # )
848          $self->{state} = BEFORE_TOKEN_STATE;          $self->{state} = BEFORE_TOKEN_STATE;
849          $self->{c} = $self->{get_char}->();          $self->{c} = $self->{get_char}->($self);
850          return $self->{t};          return $self->{t};
851          #redo A;          #redo A;
852        } elsif ($self->{c} == 0x005C) { # \        } elsif ($self->{c} == 0x005C) { # \
853          $self->{state} = ESCAPE_OPEN_STATE; $q = 1;          $self->{state} = ESCAPE_OPEN_STATE; $q = 1;
854          $self->{c} = $self->{get_char}->();          $self->{c} = $self->{get_char}->($self);
855          redo A;          redo A;
856        } else {        } else {
857          ## TODO: Should we consider matches of "(" and ")", '"', or "'"?          ## TODO: Should we consider matches of "(" and ")", '"', or "'"?
# Line 862  sub get_next_token ($) { Line 862  sub get_next_token ($) {
862              URI_PREFIX_INVALID_TOKEN, URI_PREFIX_INVALID_TOKEN,              URI_PREFIX_INVALID_TOKEN, URI_PREFIX_INVALID_TOKEN,
863          }->{$self->{t}->{type}};          }->{$self->{t}->{type}};
864          # stay in the state.          # stay in the state.
865          $self->{c} = $self->{get_char}->();          $self->{c} = $self->{get_char}->($self);
866          redo A;          redo A;
867        }        }
868      } elsif ($self->{state} == ESCAPE_OPEN_STATE) {      } elsif ($self->{state} == ESCAPE_OPEN_STATE) {
# Line 871  sub get_next_token ($) { Line 871  sub get_next_token ($) {
871          ## NOTE: second character of |unicode| in |escape|.          ## NOTE: second character of |unicode| in |escape|.
872          $char = $self->{c} - 0x0030;          $char = $self->{c} - 0x0030;
873          $self->{state} = ESCAPE_STATE; $i = 2;          $self->{state} = ESCAPE_STATE; $i = 2;
874          $self->{c} = $self->{get_char}->();          $self->{c} = $self->{get_char}->($self);
875          redo A;          redo A;
876        } elsif (0x0041 <= $self->{c} and $self->{c} <= 0x0046) { # A..F        } elsif (0x0041 <= $self->{c} and $self->{c} <= 0x0046) { # A..F
877          ## NOTE: second character of |unicode| in |escape|.          ## NOTE: second character of |unicode| in |escape|.
878          $char = $self->{c} - 0x0041 + 0xA;          $char = $self->{c} - 0x0041 + 0xA;
879          $self->{state} = ESCAPE_STATE; $i = 2;          $self->{state} = ESCAPE_STATE; $i = 2;
880          $self->{c} = $self->{get_char}->();          $self->{c} = $self->{get_char}->($self);
881          redo A;          redo A;
882        } elsif (0x0061 <= $self->{c} and $self->{c} <= 0x0066) { # a..f        } elsif (0x0061 <= $self->{c} and $self->{c} <= 0x0066) { # a..f
883          ## NOTE: second character of |unicode| in |escape|.          ## NOTE: second character of |unicode| in |escape|.
884          $char = $self->{c} - 0x0061 + 0xA;          $char = $self->{c} - 0x0061 + 0xA;
885          $self->{state} = ESCAPE_STATE; $i = 2;          $self->{state} = ESCAPE_STATE; $i = 2;
886          $self->{c} = $self->{get_char}->();          $self->{c} = $self->{get_char}->($self);
887          redo A;          redo A;
888        } elsif ($self->{c} == 0x000A or # \n        } elsif ($self->{c} == 0x000A or # \n
889                 $self->{c} == 0x000C) { # \f                 $self->{c} == 0x000C) { # \f
# Line 899  sub get_next_token ($) { Line 899  sub get_next_token ($) {
899            }->{$self->{t}->{type}};            }->{$self->{t}->{type}};
900            $self->{t}->{value} .= chr $self->{c};            $self->{t}->{value} .= chr $self->{c};
901            $self->{state} = URI_UNQUOTED_STATE;            $self->{state} = URI_UNQUOTED_STATE;
902            $self->{c} = $self->{get_char}->();            $self->{c} = $self->{get_char}->($self);
903            redo A;            redo A;
904          } else {          } else {
905            ## Note: In |nl| in ... in |string| or |ident|.            ## Note: In |nl| in ... in |string| or |ident|.
906            $self->{state} = STRING_STATE;            $self->{state} = STRING_STATE;
907            $self->{c} = $self->{get_char}->();            $self->{c} = $self->{get_char}->($self);
908            redo A;            redo A;
909          }          }
910        } elsif ($self->{c} == 0x000D) { # \r        } elsif ($self->{c} == 0x000D) { # \r
# Line 919  sub get_next_token ($) { Line 919  sub get_next_token ($) {
919                URI_PREFIX_INVALID_TOKEN, URI_PREFIX_INVALID_TOKEN,                URI_PREFIX_INVALID_TOKEN, URI_PREFIX_INVALID_TOKEN,
920            }->{$self->{t}->{type}};            }->{$self->{t}->{type}};
921            $self->{state} = ESCAPE_BEFORE_LF_STATE;            $self->{state} = ESCAPE_BEFORE_LF_STATE;
922            $self->{c} = $self->{get_char}->();            $self->{c} = $self->{get_char}->($self);
923            redo A;            redo A;
924          } else {          } else {
925            ## Note: In |nl| in ... in |string| or |ident|.            ## Note: In |nl| in ... in |string| or |ident|.
926            $self->{state} = ESCAPE_BEFORE_LF_STATE;            $self->{state} = ESCAPE_BEFORE_LF_STATE;
927            $self->{c} = $self->{get_char}->();            $self->{c} = $self->{get_char}->($self);
928            redo A;            redo A;
929          }          }
930        } elsif ($self->{c} == -1) {        } elsif ($self->{c} == -1) {
# Line 934  sub get_next_token ($) { Line 934  sub get_next_token ($) {
934          $self->{t}->{value} .= chr $self->{c};          $self->{t}->{value} .= chr $self->{c};
935          $self->{state} = $q == 0 ? NAME_STATE :          $self->{state} = $q == 0 ? NAME_STATE :
936              $q == 1 ? URI_UNQUOTED_STATE : STRING_STATE;              $q == 1 ? URI_UNQUOTED_STATE : STRING_STATE;
937          $self->{c} = $self->{get_char}->();          $self->{c} = $self->{get_char}->($self);
938          redo A;          redo A;
939        }        }
940    
# Line 1014  sub get_next_token ($) { Line 1014  sub get_next_token ($) {
1014          }          }
1015        } elsif ($q == 1) {        } elsif ($q == 1) {
1016          $self->{state} = URI_UNQUOTED_STATE;          $self->{state} = URI_UNQUOTED_STATE;
1017          $self->{c} = $self->{get_char}->();          $self->{c} = $self->{get_char}->($self);
1018          redo A;          redo A;
1019        } else {        } else {
1020          unshift @{$self->{token}}, {type => DELIM_TOKEN, value => '\\',          unshift @{$self->{token}}, {type => DELIM_TOKEN, value => '\\',
# Line 1037  sub get_next_token ($) { Line 1037  sub get_next_token ($) {
1037        if (0x0030 <= $self->{c} and $self->{c} <= 0x0039) { # 0..9        if (0x0030 <= $self->{c} and $self->{c} <= 0x0039) { # 0..9
1038          $char = $char * 0x10 + $self->{c} - 0x0030;          $char = $char * 0x10 + $self->{c} - 0x0030;
1039          $self->{state} = ++$i == 7 ? ESCAPE_BEFORE_NL_STATE : ESCAPE_STATE;          $self->{state} = ++$i == 7 ? ESCAPE_BEFORE_NL_STATE : ESCAPE_STATE;
1040          $self->{c} = $self->{get_char}->();          $self->{c} = $self->{get_char}->($self);
1041          redo A;          redo A;
1042        } elsif (0x0041 <= $self->{c} and $self->{c} <= 0x0046) { # A..F        } elsif (0x0041 <= $self->{c} and $self->{c} <= 0x0046) { # A..F
1043          $char = $char * 0x10 + $self->{c} - 0x0041 + 0xA;          $char = $char * 0x10 + $self->{c} - 0x0041 + 0xA;
1044          $self->{state} = ++$i == 7 ? ESCAPE_BEFORE_NL_STATE : ESCAPE_STATE;          $self->{state} = ++$i == 7 ? ESCAPE_BEFORE_NL_STATE : ESCAPE_STATE;
1045          $self->{c} = $self->{get_char}->();          $self->{c} = $self->{get_char}->($self);
1046          redo A;          redo A;
1047        } elsif (0x0061 <= $self->{c} and $self->{c} <= 0x0066) { # a..f        } elsif (0x0061 <= $self->{c} and $self->{c} <= 0x0066) { # a..f
1048          $char = $char * 0x10 + $self->{c} - 0x0061 + 0xA;          $char = $char * 0x10 + $self->{c} - 0x0061 + 0xA;
1049          $self->{state} = ++$i == 7 ? ESCAPE_BEFORE_NL_STATE : ESCAPE_STATE;          $self->{state} = ++$i == 7 ? ESCAPE_BEFORE_NL_STATE : ESCAPE_STATE;
1050          $self->{c} = $self->{get_char}->();          $self->{c} = $self->{get_char}->($self);
1051          redo A;          redo A;
1052        } elsif ($self->{c} == 0x0020 or # SP        } elsif ($self->{c} == 0x0020 or # SP
1053                 $self->{c} == 0x000A or # \n                 $self->{c} == 0x000A or # \n
# Line 1056  sub get_next_token ($) { Line 1056  sub get_next_token ($) {
1056          $self->{t}->{value} .= chr $char;          $self->{t}->{value} .= chr $char;
1057          $self->{state} = $q == 0 ? NAME_STATE :          $self->{state} = $q == 0 ? NAME_STATE :
1058              $q == 1 ? URI_UNQUOTED_STATE : STRING_STATE;              $q == 1 ? URI_UNQUOTED_STATE : STRING_STATE;
1059          $self->{c} = $self->{get_char}->();          $self->{c} = $self->{get_char}->($self);
1060          redo A;          redo A;
1061        } elsif ($self->{c} == 0x000D) { # \r        } elsif ($self->{c} == 0x000D) { # \r
1062          $self->{state} = ESCAPE_BEFORE_LF_STATE;          $self->{state} = ESCAPE_BEFORE_LF_STATE;
1063          $self->{c} = $self->{get_char}->();          $self->{c} = $self->{get_char}->($self);
1064          redo A;          redo A;
1065        } else {        } else {
1066          $self->{t}->{value} .= chr $char;          $self->{t}->{value} .= chr $char;
# Line 1078  sub get_next_token ($) { Line 1078  sub get_next_token ($) {
1078          $self->{t}->{value} .= chr $char;          $self->{t}->{value} .= chr $char;
1079          $self->{state} = $q == 0 ? NAME_STATE :          $self->{state} = $q == 0 ? NAME_STATE :
1080              $q == 1 ? URI_UNQUOTED_STATE : STRING_STATE;              $q == 1 ? URI_UNQUOTED_STATE : STRING_STATE;
1081          $self->{c} = $self->{get_char}->();          $self->{c} = $self->{get_char}->($self);
1082          redo A;          redo A;
1083        } elsif ($self->{c} == 0x000D) { # \r        } elsif ($self->{c} == 0x000D) { # \r
1084          $self->{state} = ESCAPE_BEFORE_NL_STATE;          $self->{state} = ESCAPE_BEFORE_NL_STATE;
1085          $self->{c} = $self->{get_char}->();          $self->{c} = $self->{get_char}->($self);
1086          redo A;          redo A;
1087        } else {        } else {
1088          $self->{t}->{value} .= chr $char;          $self->{t}->{value} .= chr $char;
# Line 1096  sub get_next_token ($) { Line 1096  sub get_next_token ($) {
1096        if ($self->{c} == 0x000A) { # \n        if ($self->{c} == 0x000A) { # \n
1097          $self->{state} = $q == 0 ? NAME_STATE :          $self->{state} = $q == 0 ? NAME_STATE :
1098              $q == 1 ? URI_UNQUOTED_STATE : STRING_STATE;              $q == 1 ? URI_UNQUOTED_STATE : STRING_STATE;
1099          $self->{c} = $self->{get_char}->();          $self->{c} = $self->{get_char}->($self);
1100          redo A;          redo A;
1101        } else {        } else {
1102          $self->{state} = $q == 0 ? NAME_STATE :          $self->{state} = $q == 0 ? NAME_STATE :
# Line 1111  sub get_next_token ($) { Line 1111  sub get_next_token ($) {
1111        ## Or, in |URI|.        ## Or, in |URI|.
1112        if ($self->{c} == 0x005C) { # \        if ($self->{c} == 0x005C) { # \
1113          $self->{state} = ESCAPE_OPEN_STATE;          $self->{state} = ESCAPE_OPEN_STATE;
1114          $self->{c} = $self->{get_char}->();          $self->{c} = $self->{get_char}->($self);
1115          redo A;          redo A;
1116        } elsif ($self->{c} == $q) { # " | '        } elsif ($self->{c} == $q) { # " | '
1117          if ($self->{t}->{type} == STRING_TOKEN) {          if ($self->{t}->{type} == STRING_TOKEN) {
1118            $self->{state} = BEFORE_TOKEN_STATE;            $self->{state} = BEFORE_TOKEN_STATE;
1119            $self->{c} = $self->{get_char}->();            $self->{c} = $self->{get_char}->($self);
1120            return $self->{t};            return $self->{t};
1121            #redo A;            #redo A;
1122          } else {          } else {
1123            $self->{state} = URI_AFTER_WSP_STATE;            $self->{state} = URI_AFTER_WSP_STATE;
1124            $self->{c} = $self->{get_char}->();            $self->{c} = $self->{get_char}->($self);
1125            redo A;            redo A;
1126          }          }
1127        } elsif ($self->{c} == 0x000A or # \n        } elsif ($self->{c} == 0x000A or # \n
# Line 1143  sub get_next_token ($) { Line 1143  sub get_next_token ($) {
1143        } else {        } else {
1144          $self->{t}->{value} .= chr $self->{c};          $self->{t}->{value} .= chr $self->{c};
1145          # stay in the state          # stay in the state
1146          $self->{c} = $self->{get_char}->();          $self->{c} = $self->{get_char}->($self);
1147          redo A;          redo A;
1148        }        }
1149      } elsif ($self->{state} == NUMBER_STATE) {      } elsif ($self->{state} == NUMBER_STATE) {
# Line 1151  sub get_next_token ($) { Line 1151  sub get_next_token ($) {
1151        if (0x0030 <= $self->{c} and $self->{c} <= 0x0039) {        if (0x0030 <= $self->{c} and $self->{c} <= 0x0039) {
1152          $self->{t}->{value} .= chr $self->{c};          $self->{t}->{value} .= chr $self->{c};
1153          # stay in the state          # stay in the state
1154          $self->{c} = $self->{get_char}->();          $self->{c} = $self->{get_char}->($self);
1155          redo A;          redo A;
1156        } elsif ($self->{c} == 0x002E) { # .        } elsif ($self->{c} == 0x002E) { # .
1157          $self->{state} = NUMBER_DOT_STATE;          $self->{state} = NUMBER_DOT_STATE;
1158          $self->{c} = $self->{get_char}->();          $self->{c} = $self->{get_char}->($self);
1159          redo A;          redo A;
1160        } else {        } else {
1161          $self->{t}->{number} = $self->{t}->{value};          $self->{t}->{number} = $self->{t}->{value};
# Line 1169  sub get_next_token ($) { Line 1169  sub get_next_token ($) {
1169        if (0x0030 <= $self->{c} and $self->{c} <= 0x0039) {        if (0x0030 <= $self->{c} and $self->{c} <= 0x0039) {
1170          $self->{t}->{value} .= '.' . chr $self->{c};          $self->{t}->{value} .= '.' . chr $self->{c};
1171          $self->{state} = NUMBER_DOT_NUMBER_STATE;          $self->{state} = NUMBER_DOT_NUMBER_STATE;
1172          $self->{c} = $self->{get_char}->();          $self->{c} = $self->{get_char}->($self);
1173          redo A;          redo A;
1174        } else {        } else {
1175          unshift @{$self->{token}}, {type => DOT_TOKEN};          unshift @{$self->{token}}, {type => DOT_TOKEN};
# Line 1185  sub get_next_token ($) { Line 1185  sub get_next_token ($) {
1185        if (0x0030 <= $self->{c} and $self->{c} <= 0x0039) {        if (0x0030 <= $self->{c} and $self->{c} <= 0x0039) {
1186          $self->{t}->{value} .= '.' . chr $self->{c};          $self->{t}->{value} .= '.' . chr $self->{c};
1187          $self->{state} = NUMBER_DOT_NUMBER_STATE;          $self->{state} = NUMBER_DOT_NUMBER_STATE;
1188          $self->{c} = $self->{get_char}->();          $self->{c} = $self->{get_char}->($self);
1189          redo A;          redo A;
1190        } else {        } else {
1191          $self->{state} = BEFORE_TOKEN_STATE;          $self->{state} = BEFORE_TOKEN_STATE;
# Line 1201  sub get_next_token ($) { Line 1201  sub get_next_token ($) {
1201        if (0x0030 <= $self->{c} and $self->{c} <= 0x0039) {        if (0x0030 <= $self->{c} and $self->{c} <= 0x0039) {
1202          $self->{t}->{value} .= chr $self->{c};          $self->{t}->{value} .= chr $self->{c};
1203          # stay in the state          # stay in the state
1204          $self->{c} = $self->{get_char}->();          $self->{c} = $self->{get_char}->($self);
1205          redo A;          redo A;
1206        } else {        } else {
1207          $self->{t}->{number} = $self->{t}->{value};          $self->{t}->{number} = $self->{t}->{value};

Legend:
Removed from v.1.18  
changed lines
  Added in v.1.19

[email protected]
ViewVC Help
Powered by ViewVC 1.1.24