########################################################################### package Netfax::Grammar; ########################################################################### # $Id: Grammar.pm,v 1.3 2003/12/09 18:35:28 lcampos Exp $ use strict; use warnings; our( $VERSION, @ISA, @EXPORT, @EXPORT_OK, %EXPORT_TAGS ); BEGIN{ use Exporter; $VERSION = do{my@r=(q$Revision: 1.3 $=~/\d+/g);sprintf"%d."."%02d"x$#r,@r}; use base qw( Exporter ); } @EXPORT_OK = qw( $command_line $subject_spec $telephone_list $option $option_spec $from_spec $domainname_spec $username_spec ); ########################################################################### # Gramatica para capturar linha de comando (RFC822 "Subject:") my $time_spec = qr{ # Hora: dois digitos codificando numeros de 00 a 23. (?:[01]\d|2[0-3]) # Dois pontos, separador de hora/min, opcional. :? # Minutos: dois digitos, codificando minutos de 00 a 59 [0-5]\d}x; my $day_spec = qr{ # Dias de 01 a 09 0[1-9] | # Dias de 10 a 29 [12][0-9] | # Dias 30 e 31. 3[01] }x; my $month_spec = qr{ # Meses de 01 a 09 0[1-9] | # Meses 10, 11 e 12 1[012] }x; my $year_spec = qr{ # Seculo vinte, apenas 20 # Decadas: de 03 a 99. (?:0[3-9]|[1-9]\d) }x; my $date_sep = qr{ # Separadores validos sao '.' e '-'. (?:\.|-) }x; my $date_spec = qr{ # Dia, de 01 a 31. $day_spec # Separador de data, opcional. $date_sep? # Mes, de 01 a 12. $month_spec # Separador de data, opcional. $date_sep? # Ano, de 2003 a 2099. $year_spec }x; our $option = qr{ # Todas as opcoes comecam com '/' / (?: # IMO ou IM [Ii][Mm][Oo]? | # NSIM ou SIM [Nn]?[Ss][Ii][Mm] | # D (data) [Dd]$date_spec | # H (hora) [Hh]$time_spec ) }x; # Captura o valor passado como argumento em algumas opcoes. our $option_spec = qr{ # Todas as opcoes comecam com '/' / (?: # IMO ou IM ([Ii][Mm][Oo])? | # NSIM ou SIM ([Nn]?[Ss][Ii][Mm]) | # D (data) [Dd]($date_spec) | # H (hora) [Hh]($time_spec) ) }x; my $option_list = qr{ # lista de opcoes: (?: # uma opcao $option # seguida de zero ou mais espacos \s* # tantas vezes quantas se puder encontrar. )* }x; my $phone = qr{ (?: # Caracteres '-', '+', '(', ')', '.', '0-9', # 'a-z', 'A-Z', '_' [-+\(\)\.\w] # ou | # todo espaco em branco (' ') nao seguido de virgula \ (?!,) # obrigatoriamente uma vez, e # tantas mais quantas voce conseguir. )+ }x; my $phone_list = qr{ $phone(?:(?:\s*,\s*)$phone)* }x; # Linha de comando: captura a lista de telefones # e a lista de opcoes separadamente. our $command_line = qr{($phone_list)\s*($option_list)}x; our $subject_spec = qr{^[Ss][Uu][Bb][Jj][Ee][Cc][Tt]:\s*$command_line}x; # Fim das Regras ########################################################################### ########################################################################### # Regras para capturar telefones de uma lista de telefones our $telephone_list = qr{($phone)(?:\s*,\s*)?}x; # Fim das Regras ########################################################################### ########################################################################### # Regras para capturar o RFC822 "From:" de um email our $username_spec = qr{ # Username [A-Za-z0-9_.-]+ }x; our $domainname_spec = qr;(?:$username_spec\.)+[A-Za-z]{2,4};x; our $from_spec = qr{ $username_spec # "at" @ $domainname_spec }x; # Fim das Regras ########################################################################### 1;__END__