Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- use strict;
- use warnings;
- use Data::Dumper;
- my $expr = "(print (add 3 (add (min 9 3) 4)))";
- my $stack = [];
- sub op {
- push @$stack, [];
- }
- sub clos {
- my $t = pop @$stack;
- my $n = pop @$stack;
- push @$n, $t;
- push @$stack, $n;
- }
- sub st {
- my $x = shift;
- my $t = pop @$stack;
- push @$t, {token => $x};
- push @$stack, $t;
- }
- my $r = qr {
- (?(DEFINE)
- (?<WS> \s*)
- (?<l> \( (?{&op()}) )
- (?<r> \) (?{&clos()}))
- (?<token>(?&WS)
- ([a-zA-Z0-9]+)
- (?&WS) (?{&st($+)}))
- (?<expr> (?&l)(?&WS) (?: (?&expr)+ | (?&token)+ )+ (?&WS) (?&r) )
- )
- (?<tks> (?&expr))
- }six;
- if ($expr =~ $r) {
- print Dumper($stack);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement