nl_tokens: Reads a namespace declaration block ebnf namespace :: = T_NAMESPACE namespace_name? { top_statements } | T_NAMESPACE namespace_name ; top_statements
pl_tokens: function ( ) { const result = this . node ( "namespace" ) ; let body ; this . expect ( this . tok . T_NAMESPACE ) && this . next ( ) ; if ( this . token == "{" ) { this . currentNamespace = [ "" ] ; body = this . <mask> ( ) . read_top_statements ( ) ; this . expect ( "}" ) && this . next ( ) ; return result ( [ "" ] , body , true ) ; } else { const name = this . read_namespace_name ( ) ; if ( this . token == ";" ) { this . currentNamespace = name ; body = this . next ( ) . read_top_statements ( ) ; this . expect ( this . EOF ) ; return result ( name . name , body , false ) ; } else if ( this . token == "{" ) { this . currentNamespace = name ; body = this . next ( ) . read_top_statements ( ) ; this . expect ( "}" ) && this . next ( ) ; return result ( name . name , body , true ) ; } else if ( this . token === "(" ) { // resolve ambuiguity between namespace & function call name . resolution = this . ast . reference . RELATIVE_NAME ; name . name = name . name . substring ( 1 ) ; result . destroy ( ) ; return this . node ( "call" ) ( name , this . read_function_argument_list ( ) ) ; } else { this . error ( [ "{" , ";" ] ) ; // graceful mode : this . currentNamespace = name ; body = this . read_top_statements ( ) ; this . expect ( this . EOF ) ; return result ( name , body , false ) ; } } }