# Perl6 implementation of the 'Rule' syntax # author: Flavio S. Glock - fglock@gmail.com use v6-alpha; grammar Pugs::Grammar::P6Rule does Pugs::Grammar::BaseCategory; # this file was extracted from the P6 version in Pugs-Compiler-Rule use Pugs::Compiler::Rule; use Pugs::Compiler::Token; use Pugs::Compiler::Regex; use Pugs::Grammar::Perl6; use Pugs::Runtime::Match; our @rule_terms; # TODO - reuse 'ident' from other modules regex ident { [ | _ | <'::'> ]+ } token capturing_group { \( \) { return { capturing_group => $/{rule}() ,} } } token non_capturing_group { \[ \] { return $/{rule}() } } regex metasyntax { \< ([ | . ]+?) \> { return { metasyntax => $/[0]() ,} } } token named_capture_body { | { return { rule => $/{capturing_group}(), } } | { return { rule => $/{non_capturing_group}(),} } | { return { rule => $/{metasyntax}(), } } | { die "invalid alias syntax" } } @Pugs::Grammar::P6Rule::rule_terms = ( #*capturing_group = token { \( \) { return { capturing_group => $/{rule}() ,} } }, #*after = token { \< after \> { return { after => { rule => $/{rule}(), }, } } }, #*before = token { \< before \> { return { before => { rule => $/{rule}(), }, } } }, #*negate = token { \< \! \> { return { negate => { rule => $/{rule}(), }, } } }, regex { #metasyntax => \< ([ | \\ . | . ]+?) \> { return { metasyntax => $/[0]() ,} } }, #*named_capture = token { \$ \< \> ? \:\= ? { my $body = $/{named_capture_body}(); $body->{ident} = $/{ident}(); return { named_capture => $body, } } }, regex { #match_variable [ \$ | \@ | \% ] + { return { match_variable => $/() ,} } }, regex { #variable_rule => [ \$ | \@ | \% ] \^? [ | _ | \: \: ]+ { return { variable => $() ,} } }, regex { # closure_rule => # callback perl6 compiler \{ \} { return { closure => $/{'Pugs::Grammar::Perl6.parse'}() ,} } }, regex { #special_char => \\ . { return { special_char => $(), } } }, Pugs::Compiler::Token->compile( #dot => \. { return { 'dot' => 1 ,} } }, Pugs::Compiler::Token->compile( #non_capturing_group => \[ \] { return $/{rule}() } }, #*colon = token { ( <':::'> | \:\? | \:\+ | \:\: | \: | \$\$ | \$ | \^\^ | \^ ) { return { colon => $/() ,} } }, ); # /@rule_terms token term { | { fail } | { fail } | { fail } | > { fail } | <@Pugs::Grammar::P6Rule::rule_terms> { #print "term: ", Dumper( $_[0]->data ); return $/{'Pugs::Grammar::P6Rule::rule_terms'}() } | ( <-[ \] \} \) \> \: \? \+ \* \| \& ]> ) { #print "constant: ", Dumper( $_[0]->data ); return { 'constant' => $/[0]->() ,} } } token quantifier { $ := (?) $ := (?) $ := ( | <'??'> | <'*?'> | <'+?'> | <'?'> | <'*'> | <'+'> | ) $ := (?) { return { term => $/{term}(), quant => $/{quant}(), ws1 => $/{ws1}(), ws2 => $/{ws2}(), ws3 => $/{ws3}(), } } } token concat { $ := [ $ := { return { concat => [ { quant => $/{q1}() ,}, $/{q2}(), ] ,} } | { return { quant => $/{q1}() ,} } ] } token rule { [ ? \| ]? $ := [ \| $ := { return { alt => [ $/{q1}(), $/{q2}(), ] ,} } | { return $/{q1}() } ] }