# Perl6 implementation of the 'Term' syntax category # author: Flavio S. Glock - fglock@gmail.com use v6-alpha; grammar Pugs::Grammar::Term does Pugs::Grammar::BaseCategory; token ident { \! # $! | \?? # $?CALLER \*? # $*x # \.? # $.x - XXX causes problems with 1..5 for some reason \:? # $:x [ [ <'::'> | ] [ _ | ] [ _ | ]* ]+ | # $ == $/; $[thing] = $/[thing] | \/ # $/ } token bare_ident { [ [ <'::'> | ] [ _ | ] [ _ | ]* ]+ } token parenthesis { ? ? <')'> { return { op1 => { op => "(" }, op2 => { op => ")" }, fixity => "circumfix", exp1 => $/{'Pugs::Grammar::Expression.parse'}() } } | ? ? <')'> { return { op1 => { op => "(" }, op2 => { op => ")" }, fixity => "circumfix", exp1 => $/{'Pugs::Grammar::Perl6.block'}() } } | ? <')'> { return { op1 => { op => "(" }, op2 => { op => ")" }, fixity => "circumfix", } } } token brackets { <']'> { return { op => $/{'Pugs::Grammar::Infix.parse'}(), reduce => 1, } } | ? ? <']'> { return { op1 => { op => "[" }, op2 => { op => "]" }, fixity => "circumfix", exp1 => $/{'Pugs::Grammar::Expression.parse'}() } } | ? ? <']'> { return { op1 => { op => "[" }, op2 => { op => "]" }, fixity => "circumfix", exp1 => $/{'Pugs::Grammar::Perl6.block'}() } } | ? <']'> { return { op1 => { op => "[" }, op2 => { op => "]" }, fixity => "circumfix", } } } token cpan_bareword { ( [ - ]+ ) } regex perl5source { (.*?) [ ; | ] use v6 (.)*? ; { return { perl5source => $/[0]() } } } token term:<$> { [ { return { scalar => '$' ~ $/() ,} } | (\d+) { return { scalar => '$' ~ $/() ,} } ] } token term:<$.> { { return { scalar => '$.' ~ $/() ,} } } token term:<$/> { { return { scalar => '$/' ,} } } token term:<$()> { { return { 'op1' => 'call', 'sub' => { 'scalar' => '$/', } } } } token term:{'$<'} { ( ) \> { return { scalar => { match_variable => $/[0]() ,} } } } token term:<@> { # XXX t/subroutines/multidimensional_arglists.t \; { return { die => "not implemented" } } | { return { array => "\@" ~ $/() ,} } } token term:<%> { { return { hash => "\%" ~ $/() ,} } } token term:<%(> { { return { 'exp1' => $/{'Pugs::Grammar::Term.parenthesis'}(), 'fixity' => 'prefix', 'op1' => { 'op' => 'hash', } } } } token term:<&> { { return { code => "\&" ~ $/() ,} } } token term:<(> { { return $/{'Pugs::Grammar::Term.parenthesis'}() } } token term:<[> { { return $/{'Pugs::Grammar::Term.brackets'}() } } token term:<{> { ? <'}'> { return { bare_block => { statements => [] }, } } | ? ? <'}'> { return { bare_block => $/{'Pugs::Grammar::Perl6.statements'}(), } } } token term:{'->'} { [ ? ? \{ ? ? \} { return { pointy_block => $/{'Pugs::Grammar::Perl6.statements'}(), signature => $/{'Pugs::Grammar::Perl6.signature_no_invocant'}(), } } | ? \{ ? ? \} { return { pointy_block => $/{'Pugs::Grammar::Perl6.statements'}(), signature => undef, } } ] } token term:<.> { # .method op { return { dot_bareword => $/() ,} } } token term:<...> { { return { term => "yada" } } } token term: { { return { term => "self" } } } token term: { { return { term => "undef" } } } token term: { ? { return { exp1 => $/{'Pugs::Grammar::Term.parse'}(), attribute => $/{'Pugs::Grammar::Perl6.attribute'}(), variable_declarator => "my", } } } token term: { ? { return { exp1 => $/{'Pugs::Grammar::Term.parse'}(), attribute => $/{'Pugs::Grammar::Perl6.attribute'}(), variable_declarator => "our", } } } token term: { ? { return { exp1 => $/{'Pugs::Grammar::Term.parse'}(), attribute => $/{'Pugs::Grammar::Perl6.attribute'}(), variable_declarator => "has", } } } token term: { ? { return { exp1 => $/{'Pugs::Grammar::Term.parse'}(), attribute => $/{'Pugs::Grammar::Perl6.attribute'}(), variable_declarator => "state", } } } token term: { ? { return { exp1 => $/{'Pugs::Grammar::Term.parse'}(), attribute => $/{'Pugs::Grammar::Perl6.attribute'}(), variable_declarator => "constant", } } } token term: { { return { substitution => $/{'Pugs::Grammar::Term.substitution'}(), } } } token term: { { return { rx => $/{'Pugs::Grammar::Term.rx'}(), } } } token term: { { return { rx => $/{'Pugs::Grammar::Term.rx'}(), } } } token term: { { return { rx => $/{'Pugs::Grammar::Term.rx_body'}(), } } } token term: { ### perl5:Test::More { return { bareword => $/{'Pugs::Grammar::Term.bare_ident'}(), lang => 'perl5', } } } token term: { # "use v5" v5 ?; { return $/{perl5source}() } | # default { return { bareword => 'use' } } } token term: { # { print "statement do \n"; } $ := { return { statement => 'do', exp1 => $/{exp1}(), } } } token term:<:> { ### pair - long: # :foo ([_|\w]+) \< { return { pair => { key => { single_quoted => $/[0]() }, value => { single_quoted => $/{'Pugs::Grammar::Quote.angle_quoted'}() }, } } } | # :foo(exp) ([_|\w]+) \( ? ? \) { return { pair => { key => { single_quoted => $/[0]() }, value => $/{'Pugs::Grammar::Expression.parse'}(), } } } | # :$foo \$ ((_|\w)+) { return { pair => { key => { single_quoted => $/[0]() }, value => { scalar => '$' ~ $/[0]() }, } } } | # :foo ((_|\w)+) { return { pair => { key => { single_quoted => $/[0]() }, value => { num => 1 }, } } } | # :!foo <'!'> ((_|\w)+) { return { pair => { key => { single_quoted => $/[0]() }, value => { num => 0 }, } } } } token term:{''} { ### num/int \d+ [ \.\d+ [ <[Ee]> <[+-]>? \d+ ]? { return { num => $() ,} } | <[Ee]> <[+-]>? \d+ { return { num => $() ,} } | { return { int => $() ,} } ] | { return $/{'Pugs::Grammar::Perl6.sub_decl'}(); } | { return $/{'Pugs::Grammar::Perl6.class_decl'}(); } | ### Test-0.0.6 { return { cpan_bareword => $/{'Pugs::Grammar::Term.cpan_bareword'}() } } | ### Test::More { return { bareword => $/{'Pugs::Grammar::Term.bare_ident'}() } } } token term: { ? { return { trait => 'BEGIN', %( $/{'Pugs::Grammar::Perl6.block'}() ), } } } token term: { ? { return { trait => 'CHECK', %( $/{'Pugs::Grammar::Perl6.block'}() ), } } } token term: { ? { return { trait => 'INIT', %( $/{'Pugs::Grammar::Perl6.block'}() ), } } } token term: { ? { return { trait => 'START', %( $/{'Pugs::Grammar::Perl6.block'}() ), } } } token term: { ? { return { trait => 'FIRST', %( $/{'Pugs::Grammar::Perl6.block'}() ), } } } token term: { ? { return { trait => 'ENTER', %( $/{'Pugs::Grammar::Perl6.block'}() ), } } } token parse { <%::_V6_GRAMMAR::term> { #print "BaseCategory matched hash ", Dumper( $_[0]->data ); return $/{'::_V6_GRAMMAR::term'}(); } }