#!/usr/bin/env perl # demonstration of a simple lexer that uses the following features of Perl: # (?{ code }) - run a piece of code, in the middle of running a regexp # $^N - the most recent capture group # $^R - the return value of the last (?{ ... }) use strict; use warnings; use Data::Dumper; my $str = '(3 + 2) * 5'; my @tokens; $str =~ / ^ ( (?: \s+ | ( \( ) (?{ [OPEN_PAREN => $^N] }) | ( \) ) (?{ [CLOSE_PAREN => $^N] }) | ( \d+ ) (?{ [NUMBER => $^N] }) | ( [-+*\/] ) (?{ [OPERATOR => $^N] }) ) (?{ push @tokens, $^R if $^R; undef; # reset $^R }) )* $ /x or die "syntax error\n"; print Dumper \@tokens;