# This is the Perl 6 Grammar used to Parse and generate the # Abstract Syntax Tree (AST) - fglock # # This code is compiled and executed by using the previously # compiled version, which is stored in "$filename-cached.pl" # # Things that go in this file are: # - anything that does *not* contain a statement like: # eval( '...', :lang); # - anything that directly alters the Perl 6 Grammar # - everything else go into the p6primitives.pl file, or into # a Module # this is a comment - putter++ for writing the comment regex grammar grammar1; # rule xxx :P5 {foo} # XXX - rewrite this! rule perl5_regex { [ \. | \| | \* | \+ | \( | \) | \[ | \] | \? | \: | \s | \w | \_ | \\ | \^ | \$ | \n | \# | \- | \< | \> | \! | alnum ]* { return { perl5_regex => $() ,} } } rule perl5_rule_decl { rule ? \: P5 \{ \} { return { perl5_rule_decl => $() ,} } } push @grammar1::statements, \&perl5_rule_decl; rule word :P5 {^([_[:alnum:]]+)} rule any :P5 {^(.)} rule escaped_char :P5 {^\\(.)} rule newline :P5 {^(\n)} rule ws :P5 {^(\s+)} rule p6ws :P5 {^((?:\s|\#(?-s:.)*)+)} # XXX - set non-capture flag? # XXX - incomplete - needs a return block rule non_capturing_subrule :P5 {^\<\?(.*?)\>} push @rule_terms, \&non_capturing_subrule; # XXX - incomplete - needs a return block rule negated_subrule :P5 {^\<\!(.*?)\>} push @rule_terms, \&negated_subrule; # XXX - incomplete - needs a return block rule subrule :P5 {^\<(.*?)\>} push @rule_terms, \&subrule; rule const_word { { return { constant => $() ,} } } unshift @rule_terms, \&const_word; rule const_escaped_char { { return { constant => $() ,} } } unshift @rule_terms, \&const_escaped_char; rule dot { (\.) { return { dot => $() ,} } } unshift @rule_terms, \˙ rule rule { [ | ]* } rule non_capturing_group { \[ \] } push @rule_terms, \&non_capturing_group; rule closure_rule { { return { closure => $() ,} } } unshift @rule_terms, \&closure_rule; rule variable_rule { { return { variable => $() ,} } } unshift @rule_terms, \&variable_rule; rule runtime_alternation { \< \> { return { runtime_alternation => $() ,} } } unshift @rule_terms, \&runtime_alternation; rule named_capture { \$ ? \:\= ? \( \) { return { named_capture => $() ,} } } unshift @rule_terms, \&named_capture; rule immediate_statement_rule { ? <@grammar1::statements> ? } rule grammar { * } rule rule_decl { rule ? \{ \} { return { rule_decl => $() ,} } } push @grammar1::statements, \&rule_decl; rule grammar_name { grammar ? \; { return { grammar_name => $() ,} } } push @statements, \&grammar_name; rule _push { $op := (push|unshift) ? \, ? $code := (.*?) ? \; { return { _push => $() ,} } } push @statements, \&_push; rule pod { \=[pod|head1|kwid|for] .*? \=cut } push @statements, \&pod; rule use_v6 { use v6 \-pugs ? \; } push @statements, \&use_v6; rule term1 { <@grammar1::terms> } rule list { [ ? \, ? ]* ? } rule block { \{ $list := ( [ ? <@grammar1::statements> ]* ) ? \} { return { block => $() ,} } } push @statements, \█ rule macro_decl { macro $prefix := () \: \< $id := (.*?) \> ? \( ? ? \) ? is parsed ? \( ? \/ ? ? \/ ? \) ? { return { macro => $() ,} } } push @statements, \¯o_decl; push @terms, \&variable; push @terms, \&literal; rule _print { $op := (print|say|warn|die) ? \; { return { _print => $() ,} } } push @statements, \&_print; rule _my { $op := (my|our|local) ? \; { return { _my => $() ,} } } push @statements, \&_my; rule _simple_statement { $op := (die|\.\.\.) \; { return { _simple_statement => $() ,} } } push @statements, \&_simple_statement; rule sub_decl { sub $fix := (infix|prefix|postfix) \: \< $id := (.*?) \> ? { return { sub_decl => $() ,} } } push @statements, \&sub_decl; rule term2 { $term1 := () ? $op := (<@grammar1::ops>) ? $term2 := () { return { sub_application_term => $() ,} } } rule sub_application { $term1 := (|) ? $op := (<@grammar1::ops>) ? $term2 := (|) ? \; { return { sub_application => $() ,} } } push @statements, \&sub_application; rule eval_perl5 { eval ? \( ? ? \, ? \: lang \< perl5 \> ? \) ? \; { return { eval_perl5 => $ } } } push @statements, \&eval_perl5; rule _return { return $val := (|) ? \; { return { _return => $() ,} } } push @statements, \&_return;