#! /usr/local/bin/perl -w
#
# naive - generate a regular expression that will lex regular expressions
# it is naive in the sense that it can't lex certain patterns, such as a
# pattern that contains nested parentheses (e.g. /ab(?:cd(?ef)?gh)+ij/ )
#
# The emitted regular expression is the default pattern that Regexp::Assemble
# uses to pick apart a string into tokens suitable for being assembled. If it
# isn't sufficiently sophisticated, you will have to supply your own lexer.
#
# Copyright (C) David Landgren 2004-2005

use strict;

my $meta   =  q{\\\\[aefnrtdDwWsS]};
my $compl  =  q{[^\\w$()*+.\\/?@\\[\\\\\\]^\\{\\|\\}]-};
my $punct  = qq{\\\\$compl};
my $octal  =  q{\\\\0\d{2}};
my $hex    =  q{\\\\x(?:[\da-fA-F]{2}|\{[\da-fA-F]{4}\})};
my $ctrl   =  q{\\\\c.};
my $named  =  q{\\\\N\{\w+\}};
my $prop   =  q{\\\\[Pp](?:.|\{\w+\})};
my $class  =  q{\\[.*?(?<!\\\\)\\]};
my $paren  =  q{\\(.*?(?<!\\\\)\\)};

my $modifier   = q{(?:(?:[*+?]|\\{\\d+(?:,\\d*)?\\})\\??)};
my $modifiable = qq{$meta|$punct|$octal|$hex|$ctrl|$named|$prop|$class|$paren|.};
my $directive  = q{\\\\[bluABCEGLQUXZ]};

print <<PATTS;
default = (?:$directive|(?:$modifiable)$modifier?)

single  = (?:$meta|$punct|$octal|$hex|$ctrl|.)

unmeta  = $compl
PATTS
