my $file = slurp "PGRM1.8xp";
my $code = "";
my $line = 2;
class TI {
method Disp(*@args)
{.say for @args}
method Prompt(\var)
{var = prompt "?="}
method Input(Str $prompt, \var)
{var = prompt $prompt}
method Pause(Num $time)
{sleep $time}
}
class TIBuiltin {
has $.value;
multi method new(\set-value) {
self.new(value => set-value)
}
}
class TIFunc is TIBuiltin {
submethod CALL-ME(*@args) {
$!value.(|@args)
}
}
class TIConstant is TIBuiltin {
}
class TIVar {
has Num $!value is rw = 0;
multi method set(Num $new-value) {
$!value = $new-value
}
multi method set(TIVar $new-value) {
$!value = $new-value.get()
}
method get() {
return $!value
}
}
class TIList {
}
class TIMatrix {
}
class TIString {
}
my regex TI-var {<upper>||Θ||θ||ϴ}
my regex TI-string-var {Str<digit>}
my regex TI-list-var {[[l||ι][<upper>||Θ||θ||ϴ][<upper>||Θ||θ||ϴ||<digit>]**0..5]||L<digit>}
my regex TI-matrix-var {'['<[A..J]>']'}
my regex TI-label-var {[<upper>||<digit>||Θ||θ||ϴ]**1..2}
die "Program must start with \"PROGRAM:NAME\" at line 1" if not $file.lines[0] ~~ /^PROGRAM':'\w+/;
$file ~~ s/^PROGRAM':'\w+\n//;
$file ~~ s:g/'='/ eq /;
$file ~~ s:g/'≠'||'/='||'!='/ ne /;
#$file ~~ s///;
for $file.lines {
die "Statement must begin with a ':' at line $line" if not so m/^':'/;
given m/^':'(\N*)$/[0].Str {
when /^$/ {
$code ~= "\n"
}
when /^(.+?)['->'||'→'](<TI-var>||<TI-list-var>||<TI-matrix-var>)$/ {
$code ~= "set $1: $0;\n"
}
when /^(< DelVar Disp Goto If Input Lbl Pause Prompt Repeat While >)\s?(\N+)$/ {
given (my @m = [$0, $1])[0] {
when "Disp" {$code ~= "Disp $1;\n"}
when "If" {
if $file.lines[$line - 1] ~~ m/^':'Then$/ {
$code ~= "if $(@m[1])"
} else {
$code ~= "if $(@m[1]) \{\n"
}
}
}
}
when /^(< Else End Return Stop Then >)$/ {
given $0 {
when "Else" {$code ~= "\} else \{\n"}
when "End" {$code ~= "\}\n"}
when "Then" {$code ~= " \{\n"}
}
}
}
$line++
}
say $code
PROGRAM:PRGM1
:1->A
:2->B
:A+B->C
:
:Disp A
:Disp B
:Disp C
:Disp A+B+C
:
:If A<1
:Then
:Disp 1
:End
:
:If A=1
:Then
:Disp 2
:End
:
:If A>1
:Then
:Disp 3
:End
:
:If A+B≠C
:Disp 1
:Else
:Disp 0
:End