NQP-question

Moritz Lenz moritz at faui2k3.org
Wed Feb 9 10:41:15 UTC 2011


Am 09.02.2011 10:28, schrieb Gerd Pokorra:
> In a presentation I saw a little calculator written in NQP that read
> from and write to the commandline. How can I parse (compile) a string
> and assign the result from the grammar action to a variable with a
> NQP-program. Is it possible?
>
>
> # parser
> grammar ABC::Grammar {
>      rule TOP {<expr>  }
>      rule expr {<integer>  <addop>  <integer>  };
>      token addop { '+' | '-' }
>      token integer { \d+ }
> }
>
> # transform to ast
> class ABC::Actions {
>      method TOP($/) {
>          make PAST::Block.new( $<expr>.ast );
>      }
>
>      method expr($/) {
>          my $pirop := $<addop>  eq '-' ?? 'sub' !! 'add';
>          make PAST::Op.new( :pirop($pirop),
>                   +$<integer>[0], +$<integer>[1]);
>      }
> }
>
>
> # compiler object (HLL::Compiler is base class for compilers)
> class ABC::Compiler is HLL::Compiler {
>      ABC::Compiler.language('abc');
>      ABC::Compiler.parsegrammar(ABC::Grammar);
>      ABC::Compiler.parseactions(ABC::Actions);
> }
>
> # invoke the compiler
> my @ARGS := (pir::getinterp__p)[2];     # args from Parrot
> ABC::Compiler.command_line(@ARGS);
>
> #my $result := ....( '3+4' ) ???

my $result := ABC::Grammar.parse('3+4', :actions(ABC::Actions.new));
my $past   := $result.ast;

(haven't tested it though)

Cheers,
Moritz


More information about the parrot-dev mailing list