[svn:parrot] r35809 - trunk/languages/pipp/src/pct
[email protected] Tue, 20 Jan 2009 06:26:42 -0800 (PST)
| Newsgroups | perl.cvs.parrot |
|---|---|
| Message-ID | <[email protected]> |
Author: bernhard
Date: Tue Jan 20 06:26:42 2009
New Revision: 35809
Modified:
trunk/languages/pipp/src/pct/actions.pm
trunk/languages/pipp/src/pct/grammar.pg
Log:
[Pipp] Put code for class_member_definition into an action
Modified: trunk/languages/pipp/src/pct/actions.pm
==============================================================================
--- trunk/languages/pipp/src/pct/actions.pm (original)
+++ trunk/languages/pipp/src/pct/actions.pm Tue Jan 20 06:26:42 2009
@@ -604,6 +604,51 @@
}
}
+method class_member_definition($/) {
+ my $member_name := ~$<var_name><ident>;
+
+ make PAST::Stmts.new(
+ PAST::Op.new(
+ :pasttype('call'),
+ :name('pipp_add_attribute'),
+ PAST::Var.new(
+ :name('def'),
+ :scope('register')
+ ),
+ PAST::Val.new( :value($member_name) )
+ ),
+ PAST::Op.new(
+ :pasttype('call'),
+ :name('!ADD_TO_WHENCE'),
+ PAST::Var.new(
+ :name('def'),
+ :scope('register'),
+ ),
+ PAST::Val.new(
+ :value($member_name)
+ ),
+ $( $<literal> )
+ ),
+ # add accessors for the attribute
+ PAST::Block.new(
+ :blocktype('declaration'),
+ :name($member_name),
+ :pirflags(':method'),
+ :node( $/ ),
+ PAST::Stmts.new(
+ PAST::Var.new(
+ :name($member_name),
+ :scope('attribute')
+ )
+ )
+ )
+ );
+}
+
+method class_static_member_definition($/) {
+ make PAST::Block.new();
+}
+
method class_method_definition($/, $key) {
our @?BLOCK; # A stack of PAST::Block
@@ -706,56 +751,7 @@
# declare the attributes
for $<class_member_definition> {
- if $_<static> {
- my $member_name := ~$_<var_name><ident>;
- $block.symbol(
- $member_name,
- :scope('attribute'),
- :default( $( $_<literal> ) )
- );
-
- $block.push(
- PAST::Op.new(
- :pasttype('call'),
- :name('pipp_add_attribute'),
- PAST::Var.new(
- :name('def'),
- :scope('register')
- ),
- PAST::Val.new( :value($member_name) )
- )
- );
- $block.push(
- PAST::Op.new(
- :pasttype('call'),
- :name('!ADD_TO_WHENCE'),
- PAST::Var.new(
- :name('def'),
- :scope('register'),
- ),
- PAST::Val.new(
- :value($member_name)
- ),
- $( $_<literal> )
- )
- );
-
- # add accessors for the attribute
- $block.push(
- PAST::Block.new(
- :blocktype('declaration'),
- :name(~$_<var_name><ident>),
- :pirflags(':method'),
- :node( $/ ),
- PAST::Stmts.new(
- PAST::Var.new(
- :name(~$_<var_name><ident>),
- :scope('attribute')
- )
- )
- )
- );
- }
+ $block.push( $($_) );
}
# It's a new class definition. Make proto-object.
Modified: trunk/languages/pipp/src/pct/grammar.pg
==============================================================================
--- trunk/languages/pipp/src/pct/grammar.pg (original)
+++ trunk/languages/pipp/src/pct/grammar.pg Tue Jan 20 06:26:42 2009
@@ -267,12 +267,6 @@
token var_name { '$' <ident> }
-# keywords
-
-token static {
- 'static'
-}
-
# terms
rule method_call {
<var> '->' <method_name> '(' <argument_list> ')'
@@ -443,6 +437,7 @@
'{'
[ | <constant_definition>
| <class_member_definition>
+ | <class_static_member_definition>
| <class_method_definition>
]*
'}' {*} #= close
@@ -455,9 +450,12 @@
{*}
}
-# TODO: use a named literal match
rule class_member_definition {
- 'public' <static>? <var_name> '=' <literal> <.statement_delimiter>
+ 'public' <var_name> '=' <literal> <.statement_delimiter> {*}
+}
+
+rule class_static_member_definition {
+ 'public' 'static' <var_name> '=' <literal> <.statement_delimiter> {*}
}
rule class_method_definition {