| 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 |
|
|
| 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 |
} |
} |
| 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) { # * |
| 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. |
| 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 { |
| 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 |
| 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 { |
| 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 = { |
| 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 { |
| 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; |
| 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 |
} |
} |
| 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}}; |
| 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 { |
| 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; |
| 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 { |
| 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}; |
| 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 |
| 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 { |
| 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; |
| 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) { # ( |
| 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 |
} |
} |
| 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} = { |
| 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 ( |
| 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) { |
| 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} = { |
| 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 { |
| 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) { |
| 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} = { |
| 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 "'"? |
| 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) { |
| 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 |
| 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 |
| 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) { |
| 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 |
|
|
| 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 => '\\', |
| 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 |
| 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; |
| 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; |
| 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 : |
| 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 |
| 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) { |
| 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}; |
| 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}; |
| 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; |
| 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}; |