Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
branch: master
Fetching contributors…

Cannot retrieve contributors at this time

46 lines (39 sloc) 1.214 kb
use v6;
use GGE::Exp;
use GGE::OPTable;
class Algebra::Literal is GGE::Exp does GGE::ShowContents {
method evaluate() {
+$.ast;
}
}
class Algebra::BinOp is GGE::Exp does GGE::ShowContents {
}
class Algebra::Addition is Algebra::BinOp {
method evaluate() {
$.llist[0].evaluate() + $.llist[1].evaluate();
}
}
class Algebra::Multiplication is Algebra::BinOp {
method evaluate() {
$.llist[0].evaluate() * $.llist[1].evaluate();
}
}
given GGE::OPTable.new() -> $optable {
$optable.newtok('term:', :precedence<=>,
:parsed(&Perl6::Grammar::number),
:match(Algebra::Literal));
$optable.newtok('infix:+', :looser<term:>,
:match(Algebra::Addition));
$optable.newtok('infix:*', :tighter<infix:+>,
:match(Algebra::Multiplication));
while prompt('> ') -> $input {
my $match = $optable.parse($input);
if $match.to < $input.chars {
warn 'Could not parse the arithmetic expression';
next;
}
my $expr = $match.hash-access('expr');
say $expr.evaluate;
}
say '';
}
Jump to Line
Something went wrong with that request. Please try again.