Simple S-Expression parser in Perl5
I wrote simple S-Expression parser in Perl5.
It's only 56 lines of code, but it's works.
My own parser library generates s-exp. I need to parse it and test it.
package Data::SExpression::Lite;
use strict;
use warnings;
use utf8;
use 5.010000;
sub new {
my $class = shift;
my $self = bless {}, $class;
return $self;
}
sub parse {
my ($self, $sexp) = @_;
$self->_parse(\$sexp);
}
sub _parse {
my ($self, $sexp) = @_;
$self->lex($sexp) eq '(' or die "No opening paren";
my @tokens;
while (length($$sexp) =~ /\S/) {
my $token = $self->lex($sexp);
if ($token eq ')') {
return @tokens;
} elsif ($token eq '(') {
push @tokens, $self->_parse(\"($$sexp");
} else {
push @tokens, $token;
}
}
die "Unexpected EOF in sexp";
}
sub lex {
my ($self, $sexp) = @_;
$$sexp =~ s/^\s+//;
if ($$sexp =~ s/^\(//) {
return '(';
} elsif ($$sexp =~ s/^\)//) {
return ')';
} elsif ($$sexp =~ s/^"(.*?)"//) {
return $1;
} elsif ($$sexp =~ s/^([0-9.]+)//) {
return $1;
} elsif ($$sexp =~ s/^([a-zA-Z0-9_-]+)//) {
return $1;
} elsif ($$sexp =~ s/^([^)]+)//) {
return $1;
} else {
die "Unknown token: $$sexp";
}
}
1;
Published: 2013-07-16(Tue) 07:47