#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
my $input = $ARGV[0] // "2 * 3 + 4 # and a comment\n";
my @tokens;
$^R and push @tokens, [$^R, $1] while $^R = undef, $input =~ /( \#.*$
| [+-] (?{'AddOp'})
| [*\/] (?{'MulOp'})
| \d+ (?{'Number'})
| \( (?{'OpenParen'})
| \) (?{'CloseParen'})
| . (?{ die "Syntax error at position $-[0]\n" }) )/gmx;
IyEvdXNyL2Jpbi9wZXJsCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIERhdGE6OkR1bXBlcjsKCm15ICRpbnB1dCA9ICRBUkdWWzBdIC8vICIyICogMyArIDQgIyBhbmQgYSBjb21tZW50XG4iOwoKbXkgQHRva2VuczsKCiReUiBhbmQgcHVzaCBAdG9rZW5zLCBbJF5SLCAkMV0gd2hpbGUgJF5SID0gdW5kZWYsCiAgJGlucHV0ID1+IC8oIFwjLiokCiAgfCBccysKICB8IFsrLV0gKD97J0FkZE9wJ30pCiAgfCBbKlwvXSAoP3snTXVsT3AnfSkKICB8IFxkKyAoP3snTnVtYmVyJ30pCiAgfCBcKCAoP3snT3BlblBhcmVuJ30pCiAgfCBcKSAoP3snQ2xvc2VQYXJlbid9KQogIHwgLiAoP3sgZGllICJTeW50YXggZXJyb3IgYXQgcG9zaXRpb24gJC1bMF1cbiIgfSkKICApL2dteDsKCnByaW50IER1bXBlciBcQHRva2Vuczs=
$VAR1 = [
[
'Number',
'2'
],
[
'MulOp',
'*'
],
[
'Number',
'3'
],
[
'AddOp',
'+'
],
[
'Number',
'4'
]
];