Advertisement
Guest User

s-expression regularexp

a guest
Jul 9th, 2011
188
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 0.73 KB | None | 0 0
  1. use strict;
  2. use warnings;
  3. use Data::Dumper;
  4.  
  5. my $expr = "(print (add 3 (add (min 9 3) 4)))";
  6.  
  7. my $stack = [];
  8.  
  9. sub op {
  10. push @$stack, [];
  11. }
  12. sub clos {
  13. my $t = pop @$stack;
  14. my $n = pop @$stack;
  15. push @$n, $t;
  16. push @$stack, $n;
  17. }
  18.  
  19. sub st {
  20. my $x = shift;
  21. my $t = pop @$stack;
  22. push @$t, {token => $x};
  23. push @$stack, $t;
  24. }
  25.  
  26. my $r = qr {
  27. (?(DEFINE)
  28. (?<WS> \s*)
  29. (?<l> \( (?{&op()}) )
  30. (?<r> \) (?{&clos()}))
  31. (?<token>(?&WS)
  32. ([a-zA-Z0-9]+)
  33. (?&WS) (?{&st($+)}))
  34. (?<expr> (?&l)(?&WS) (?: (?&expr)+ | (?&token)+ )+ (?&WS) (?&r) )
  35.  
  36. )
  37. (?<tks> (?&expr))
  38.  
  39. }six;
  40. if ($expr =~ $r) {
  41. print Dumper($stack);
  42. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement