in reply to Parsing with regular expressions

Here is a way to do it that I have used before for finding tokens in C files
use strict; my $param_rx = '[^),]+'; my $list_start_rx = '\s*\(\s*'; my $list_end_rx = '\s*\)\s*'; my @regexes=( qr/^\s*/, qr/(\S+)/, qr/\s+/, qr/(\S+)/, qr/$list_start_rx/, qr/($param_rx(?:\s*,\s*$param_rx)*)?/, qr/$list_end_rx/, qr/=\s*/, qr/(?:0x)?\d+/, qr/\s*;\s*$/ ); PARSER: while (<DATA>) { foreach my $regex (@regexes) { if ( not /\G$regex/gc ) { print "^<-- Parse failed on line $. at (column " . pos() . " of + " . length($_) . ")\n"; print '"'.substr($_,0,pos())." HERE>>".substr($_,pos(),-1)."\"\n" +; last PARSER; } } } __DATA__ some list (one, two three) = 5; another list (one, two three) = 5; a bad list (one two (three))
This outputs:
^<-- Parse failed on line 3 at (column 5 of 29) "a bad HERE>> list (one two (three))"