Skip to content

Instantly share code, notes, and snippets.

@fnobi
Created December 13, 2012 07:16
Show Gist options
  • Save fnobi/4274708 to your computer and use it in GitHub Desktop.
Save fnobi/4274708 to your computer and use it in GitHub Desktop.
string周りとか不完全だけど。
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