Add rudimentary support for keywords
This commit is contained in:
parent
7f38e74e78
commit
31e8c61d5e
1 changed files with 17 additions and 0 deletions
|
@ -10,6 +10,7 @@ use constant {
|
|||
IDENT => 3,
|
||||
STRING => 4,
|
||||
NUMBER => 5,
|
||||
KEYWORD => 6,
|
||||
};
|
||||
|
||||
sub tokenize {
|
||||
|
@ -33,6 +34,13 @@ sub tokenize {
|
|||
{
|
||||
push @tokens, { type => RPAREN };
|
||||
}
|
||||
elsif($str =~ s/^'([^\s()"]+)//)
|
||||
{
|
||||
push @tokens, {
|
||||
type => KEYWORD,
|
||||
value => $1,
|
||||
};
|
||||
}
|
||||
elsif($str =~ s/^"(([^"\\]|\\.)+)"//)
|
||||
{
|
||||
my $value = $1;
|
||||
|
@ -86,6 +94,10 @@ sub lisp_format {
|
|||
{
|
||||
return "(" . join(" ", map { lisp_format($_) } @$e) . ")";
|
||||
}
|
||||
elsif (ref($e) eq "KEYWORD")
|
||||
{
|
||||
return "'" . $e->{value};
|
||||
}
|
||||
else
|
||||
{
|
||||
return "$e";
|
||||
|
@ -305,6 +317,11 @@ sub parser_expr {
|
|||
return $ctx->{$name};
|
||||
}
|
||||
}
|
||||
elsif($tok->{type} == KEYWORD)
|
||||
{
|
||||
my $k = bless { value => $tok->{value} }, "KEYWORD";
|
||||
return sub { return $k; };
|
||||
}
|
||||
elsif($tok->{type} == STRING || $tok->{type} == NUMBER)
|
||||
{
|
||||
return sub {
|
||||
|
|
Loading…
Reference in a new issue