3
0
mirror of https://github.com/pragma-/pbot.git synced 2024-11-26 22:09:26 +01:00

Plugins/Plang: simplify all the interpreter stuff to just using $plang->interpret_string()

This commit is contained in:
Pragmatic Software 2020-07-20 02:46:01 -07:00
parent c2263605b0
commit 6fb60c8d2c

View File

@ -69,11 +69,10 @@ sub cmd_plang {
my ($self, $context) = @_; my ($self, $context) = @_;
my $usage = "Usage: plang <code>; see https://github.com/pragma-/Plang"; my $usage = "Usage: plang <code>; see https://github.com/pragma-/Plang";
return $usage if not length $context->{arguments}; return $usage if not length $context->{arguments};
# run() returns result of the final statement $self->{output} = ""; # collect output of the embedded Plang program
my $result = $self->run($context->{arguments}); my $result = $self->{plang}->interpret_string($context->{arguments});
# check to see if we need to append final result to output # check to see if we need to append final result to output
$self->{output} .= $self->{plang}->{interpreter}->output_value($result) if defined $result->[1]; $self->{output} .= $self->{plang}->{interpreter}->output_value($result) if defined $result->[1];
@ -82,65 +81,8 @@ sub cmd_plang {
return length $self->{output} ? $self->{output} : "No output."; return length $self->{output} ? $self->{output} : "No output.";
} }
# run an embedded plang program
# TODO this is just a proof-of-concept at this stage; 90% of this stuff will be moved into Plang::Interpreter
sub run {
my ($self, $code) = @_;
# reset output buffer
$self->{output} = ""; # collect output of the embedded Plang program
# parse the code into an ast
my $ast = $self->{plang}->parse_string($code);
# check for parse errors
my $errors = $self->{plang}->handle_parse_errors;
return ['ERROR', $errors] if defined $errors;
# return if no program
return if not defined $ast;
# create a new environment for a Plang program
my $context = $self->{plang}->{interpreter}->new_context;
# grab our program's statements
my $program = $ast->[0];
my $statements = $program->[1];
my $result; # result of the final statement
eval {
# interpret the statements
foreach my $node (@$statements) {
my $ins = $node->[0];
if ($ins eq 'STMT') {
$result = $self->{plang}->{interpreter}->statement($context, $node->[1]);
if ($result->[0] eq 'STDOUT') {
$self->{output} .= $result->[1];
$result = undef;
next;
}
if ($result->[0] eq 'ERROR') {
$self->{output} .= "Error: $result->[1]";
$result = undef;
last;
}
}
}
};
if ($@) {
$self->{output} .= $@;
return;
}
return $result; # return result of the final statement
}
# overridden `print` built-in # overridden `print` built-in
sub print_override { sub print_override {
my ($self, $plang, $name, $arguments) = @_; my ($self, $plang, $name, $arguments) = @_;
my ($stmt, $end) = ($plang->output_value($arguments->[0]), $arguments->[1]->[1]); my ($stmt, $end) = ($plang->output_value($arguments->[0]), $arguments->[1]->[1]);