Created
December 13, 2012 07:16
-
-
Save fnobi/4274708 to your computer and use it in GitHub Desktop.
string周りとか不完全だけど。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
use strict; | |
# コマンドライン引数を、sourcecodeとする | |
my $sourcecode = $ARGV[0]; | |
my $char; | |
my $stack = ""; | |
my @tokens = []; | |
# sourcecodeを一文字ずつ見る | |
my $i = 0; | |
while ($i < length($sourcecode)) { | |
$char = substr($sourcecode, $i, 1); | |
# isString, isNumber, isIDのどれかに引っかかるかを見る | |
# 引っかかったら、stackに入れて、現在読んでいる文字列として覚えておく | |
if (isString($char)) { | |
$stack = $stack . $char; | |
print $char . " " . "[STRING]\n" | |
} elsif (isNumber($char)) { | |
$stack = $stack . $char; | |
print $char . " " . "[NUMBER]\n"; | |
} elsif (isId($char)) { | |
$stack = $stack . $char; | |
print $char . " " . "[IDENTIFIER]\n" | |
} else { | |
# どれにも引っかからなかったら、UNKNOWN | |
# いま見ていたstuckをtokensに代入 | |
# stuckはリセットする | |
push(@tokens, $stack); | |
$stack = ""; | |
print $char . " " . "[UNKNOWN]\n" | |
} | |
print "(stack = [" . $stack . "])\n"; | |
$i++; | |
} | |
# 最後に見ていたstuckをtokensに追加し、tokenが全て揃った | |
push(@tokens, $stack); | |
foreach my $token (@tokens) { | |
print $token . "\n"; | |
} | |
# 以下、isなんちゃら系の関数 | |
sub isNumber { | |
my $char = $_[0]; | |
return $char =~ /[0-9]/; | |
} | |
sub isString { | |
my $char = $_[0]; | |
return $char eq '"' || substr($stack, 0, 1) eq '"'; | |
} | |
sub isId { | |
my $char = $_[0]; | |
return $char =~ /[a-z=]/; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment