Asm-Preproc
view release on metacpan or search on metacpan
my $input = q{
a = 25/* 'hello' */;/* 'world' */;/* multi-line
*/b = 26;
'single line';'multiple line
continues here
and ends here';
"single line"; "single line"; "multiple line
continues here
and ends here";
"unfinished line
};
$input =~ s/\r\n/\n/g;
my @input = map {"$_\n"} split(/\n/, $input);
$lex->from(@input);
my @line = (qq{a = 25/* 'hello' */;/* 'world' */;/* multi-line\n}, undef, undef);
t_get(ID => 'a', @line);
t_get('=' => '=', @line);
t_get(NUM => 25, @line);
t_get(';' => ';', @line);
t_get(';' => ';', @line);
@line = (qq{*/b = 26;\n}, undef, undef);
t_get(ID => 'b', @line);
t_get('=' => '=', @line);
t_get(NUM => 26, @line);
t_get(';' => ';', @line);
@line = (qq{'single line';'multiple line\n}, undef, undef);
t_get(QSTR => 'single line', @line);
t_get(';' => ';', @line);
t_get(QSTR => "multiple line\ncontinues here\nand ends here", @line);
@line = (qq{and ends here';\n}, undef, undef);
t_get(';' => ';', @line);
@line = (qq{"single line"; "single line"; "multiple line\n}, undef, undef);
t_get(QQSTR => qq{"single line"}, @line);
t_get(';' => ';', @line);
t_get(QQSTR => qq{"single line"}, @line);
t_get(';' => ';', @line);
t_get(QQSTR => qq{"multiple line\ncontinues here\nand ends here"}, @line);
@line = (qq{and ends here";\n}, undef, undef);
t_get(';' => ';', @line);
eval {$lex->()};
is $@, "error: unbalanced token at: \"unfinished line\n", "unbalanced token";
$lex->from("/* unfinished comment ");
eval {$lex->()};
is $@, "error: unbalanced token at: /*\n", "unbalanced token";
done_testing();
#------------------------------------------------------------------------------
# TEST
sub t_get {
my($type, $value, $text, $file, $line_nr) = @_;
my $id = "[line ".(caller)[2]."]";
if (defined $type) {
isa_ok $token = $lex->(), 'Asm::Preproc::Token';
is $token->type, $type, "$id type $type";
is $token->value, $value, "$id value $value";
is $token->line->text, $text, "$id text $text";
is $token->line->file, $file, "$id file ".($file||'');
is $token->line->line_nr, $line_nr, "$id line_nr ".($line_nr||0);
}
else {
is $lex->(), undef, "$id EOF" for (1..3);
}
}
( run in 0.886 second using v1.01-cache-2.11-cpan-5e09290becf )