[svn:parrot] r35756 - in trunk/languages/pipp: src/pct t/php

[email protected]
Newsgroups perl.cvs.parrot
Message-ID <[email protected]>
Author: bernhard
Date: Mon Jan 19 06:50:34 2009
New Revision: 35756

Modified:
   trunk/languages/pipp/src/pct/actions.pm
   trunk/languages/pipp/src/pct/grammar.pg
   trunk/languages/pipp/t/php/namespace.t

Log:
[Pipp] Add support for constants with fully qualified name.
Keep the trailing '\' in namespace names.

Modified: trunk/languages/pipp/src/pct/actions.pm
==============================================================================
--- trunk/languages/pipp/src/pct/actions.pm	(original)
+++ trunk/languages/pipp/src/pct/actions.pm	Mon Jan 19 06:50:34 2009
@@ -127,7 +127,7 @@
     our $?NS;
 
     if $key eq 'open' {
-        $?NS := +$<namespace_name> ?? ~$<namespace_name>[0] !! '';
+        $?NS := +$<namespace_name> ?? ~$<namespace_name>[0] ~ '\\' !! '';
     }
     else {
         my $block :=
@@ -264,11 +264,22 @@
 
 method constant($/) {
     our $?NS;
-    make PAST::Var.new(
-        :name(~$<name>),
-        :scope('package'),
-        :namespace($?NS)
-    );
+    if $<name><leading_backslash> {
+        # fully qualified name
+        make PAST::Var.new(
+            :name(~$<name><ident>),
+            :scope('package'),
+            :namespace(~$<name><ns_path>)
+        );
+    }
+    else {
+        # access relative to current namespace
+        make PAST::Var.new(
+            :name(~$<name><ident>),
+            :scope('package'),
+            :namespace($?NS ~ $<name><ns_path>)
+        );
+    }
 }
 
 # TODO: merge with rule 'constant'

Modified: trunk/languages/pipp/src/pct/grammar.pg
==============================================================================
--- trunk/languages/pipp/src/pct/grammar.pg	(original)
+++ trunk/languages/pipp/src/pct/grammar.pg	Mon Jan 19 06:50:34 2009
@@ -251,17 +251,20 @@
 
 token method_name              { <ident> }
 
-token namespace_name           { <ns_component>* <ident> }
+token namespace_name           { <ns_path> <ident> }
 
 token name {
     <leading_backslash=ns_sep>?           # a leading backslash is optional, but significant
-    <ns_component>*                       # namespace
+    <ns_path>                             # namespace
     <ident>                               # identifier is required
 }
 
 token ns_sep                   { '\\' }   # yes, PHP 5.3 uses backslash as the namespace separator
 
-token ns_component             { <ident> <.ns_sep> }
+
+token ns_path                  {
+    [ <ident> <.ns_sep> ]*
+} 
 
 token var_name                 { '$' <ident> }
 

Modified: trunk/languages/pipp/t/php/namespace.t
==============================================================================
--- trunk/languages/pipp/t/php/namespace.t	(original)
+++ trunk/languages/pipp/t/php/namespace.t	Mon Jan 19 06:50:34 2009
@@ -88,6 +88,30 @@
 FOO in A\B
 OUT
 
+
+language_output_is( 'Pipp', <<'CODE', <<'OUT', 'constant with fully qualified names' );
+<?php
+
+namespace A {
+    const FOO = "FOO in A\n";
+}
+
+namespace A\B {
+    const FOO = "FOO in A\\B\n";
+    echo \A\FOO;
+}
+
+namespace A\B {
+    echo \A\FOO;
+    echo \A\B\FOO;
+}
+
+?>
+CODE
+FOO in A
+FOO in A\B
+OUT
+
 =for perl6
 
 package A {
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.