[phc-internals] [phc commit] r1200 - in branches/saturn: . src
src/generated src/generated_src src/pass_manager src/process_ir
codesite-noreply at google.com
codesite-noreply at google.com
Wed Apr 30 17:10:04 IST 2008
Author: paul.biggar
Date: Wed Apr 30 09:09:01 2008
New Revision: 1200
Added:
branches/saturn/src/process_ir/CLPA_unparser.h
Modified:
branches/saturn/Makefile.am
branches/saturn/Makefile.in
branches/saturn/src/generated/AST-contexts
branches/saturn/src/generated/AST.cpp
branches/saturn/src/generated/AST.h
branches/saturn/src/generated/AST_factory.cpp
branches/saturn/src/generated/cmdline.c
branches/saturn/src/generated/cmdline.h
branches/saturn/src/generated_src/ast.tea
branches/saturn/src/generated_src/phc.ggo
branches/saturn/src/pass_manager/Pass_manager.cpp
branches/saturn/src/phc.cpp
Log:
Initial version of the --sdump flag. This simply prints saturn-like
declarations of the IR to stdout. Not really tested.
This also adds get_value_as_string() to Identifiers and Literals in the
AST. I'm not sure why these were missing.
Ports the CAST fix from mainline (not using svnmerge.py -- this should
still work fine).
Remove Saturn from being analysed by etags. It seems to break vim.
Modified: branches/saturn/Makefile.am
==============================================================================
--- branches/saturn/Makefile.am (original)
+++ branches/saturn/Makefile.am Wed Apr 30 09:09:01 2008
@@ -191,6 +191,7 @@
src/process_hir/HIR_unparser.h \
src/process_ir/Clone_blank_mixins.cpp \
src/process_ir/Clone_blank_mixins.h \
+ src/process_ir/CLPA_unparser.h \
src/process_ir/debug.cpp \
src/process_ir/debug.h \
src/process_ir/Foreach.h \
@@ -607,4 +608,4 @@
# Generate tags for the test framework.
-ETAGS_ARGS=--recurse test/framework 3rdparty/clpa
+ETAGS_ARGS=--recurse test/framework
Modified: branches/saturn/Makefile.in
==============================================================================
--- branches/saturn/Makefile.in (original)
+++ branches/saturn/Makefile.in Wed Apr 30 09:09:01 2008
@@ -727,6 +727,7 @@
src/process_hir/HIR_unparser.h \
src/process_ir/Clone_blank_mixins.cpp \
src/process_ir/Clone_blank_mixins.h \
+ src/process_ir/CLPA_unparser.h \
src/process_ir/debug.cpp \
src/process_ir/debug.h \
src/process_ir/Foreach.h \
@@ -940,7 +941,7 @@
MAINTAINERCLEANFILES = Makefile.in src/generated/README.TreeTransform
# Generate tags for the test framework.
-ETAGS_ARGS = --recurse test/framework 3rdparty/clpa
+ETAGS_ARGS = --recurse test/framework
all: $(BUILT_SOURCES) config.h
$(MAKE) $(AM_MAKEFLAGS) all-recursive
Modified: branches/saturn/src/generated/AST-contexts
==============================================================================
--- branches/saturn/src/generated/AST-contexts (original)
+++ branches/saturn/src/generated/AST-contexts Wed Apr 30 09:09:01 2008
@@ -67,7 +67,7 @@
(Variable_name,Variable_name,)
(While,Statement,*)
(BOOL<bool>,Expr,)
-(CAST<String*>,CAST<String*>,)
+(CAST,CAST,)
(CLASS_NAME,CLASS_NAME,)
(CONSTANT_NAME,CONSTANT_NAME,)
(DIRECTIVE_NAME,DIRECTIVE_NAME,)
Modified: branches/saturn/src/generated/AST.cpp
==============================================================================
--- branches/saturn/src/generated/AST.cpp (original)
+++ branches/saturn/src/generated/AST.cpp Wed Apr 30 09:09:01 2008
@@ -8259,6 +8259,11 @@
transform->children_cast(this);
}
+String* CAST::get_value_as_string()
+{
+ return value;
+}
+
int CAST::classid()
{
return ID;
@@ -8274,63 +8279,41 @@
CAST* that = dynamic_cast<CAST*>(in);
if(that == NULL) return false;
- if(!match_value(that))
- return false;
+ if(this->value != NULL && that->value != NULL)
+ return (*this->value == *that->value);
else
return true;
}
-bool CAST::match_value(CAST* that)
-{
- return true;
-}
-
bool CAST::equals(Node* in)
{
CAST* that = dynamic_cast<CAST*>(in);
if(that == NULL) return false;
- if(!equals_value(that))
+ if(this->value == NULL || that->value == NULL)
+ {
+ if(this->value != NULL || that->value != NULL)
+ return false;
+ }
+ else if(*this->value != *that->value)
return false;
if(!Node::is_mixin_equal(that)) return false;
return true;
}
-bool CAST::equals_value(CAST* that)
-{
- return (*this->value == *that->value);
-}
-
CAST* CAST::clone()
{
- value = clone_value();
+ String* value = new String(*this->value);
CAST* clone = new CAST(value);
clone->Node::clone_mixin_from(this);
return clone;
}
-String* CAST::clone_value()
-{
- return value;
-}
-
void CAST::assert_valid()
{
- assert_value_valid();
+ assert(value != NULL);
Node::assert_mixin_valid();
-}
-
-void CAST::assert_value_valid()
-{
- // Assume value is valid
-}
-
-String* CAST::get_value_as_string()
-{
- {
- return value;
- }
}
CONSTANT_NAME::CONSTANT_NAME(String* value)
Modified: branches/saturn/src/generated/AST.h
==============================================================================
--- branches/saturn/src/generated/AST.h (original)
+++ branches/saturn/src/generated/AST.h Wed Apr 30 09:09:01 2008
@@ -788,7 +788,7 @@
virtual void assert_valid();
};
-// Identifier ::= INTERFACE_NAME | CLASS_NAME | METHOD_NAME |
VARIABLE_NAME | CAST<String*> | OP | CONSTANT_NAME | LABEL_NAME | DIRECTIVE_NAME;
+// Identifier ::= INTERFACE_NAME | CLASS_NAME | METHOD_NAME |
VARIABLE_NAME | CAST | OP | CONSTANT_NAME | LABEL_NAME | DIRECTIVE_NAME;
class Identifier : virtual public Source_rep
{
public:
@@ -806,6 +806,8 @@
virtual Identifier* clone() = 0;
public:
virtual void assert_valid() = 0;
+public:
+ virtual String* get_value_as_string() = 0;
};
// Class_def ::= Class_mod CLASS_NAME extends:CLASS_NAME?
implements:INTERFACE_NAME* Member* ;
@@ -1588,6 +1590,8 @@
virtual Literal* clone() = 0;
public:
virtual void assert_valid() = 0;
+public:
+ virtual String* get_value_as_string() = 0;
};
// Assignment ::= Variable is_ref:"&" Expr ;
@@ -1672,7 +1676,7 @@
virtual void assert_valid();
};
-// Cast ::= CAST<String*> Expr ;
+// Cast ::= CAST Expr ;
class Cast : virtual public Expr
{
public:
@@ -2214,23 +2218,18 @@
virtual void transform_children(Transform* transform);
public:
String* value;
+ virtual String* get_value_as_string();
public:
static const int ID = 74;
virtual int classid();
public:
virtual bool match(Node* in);
- virtual bool match_value(CAST* that);
public:
virtual bool equals(Node* in);
- virtual bool equals_value(CAST* that);
public:
virtual CAST* clone();
- virtual String* clone_value();
public:
virtual void assert_valid();
- virtual void assert_value_valid();
-public:
- String* get_value_as_string();
};
class CONSTANT_NAME : virtual public Identifier
Modified: branches/saturn/src/generated/AST_factory.cpp
==============================================================================
--- branches/saturn/src/generated/AST_factory.cpp (original)
+++ branches/saturn/src/generated/AST_factory.cpp Wed Apr 30 09:09:01 2008
@@ -491,6 +491,12 @@
assert(i == args->end());
return new OP(value);
}
+ if(!strcmp(type_id, "CAST"))
+ {
+ String* value = dynamic_cast<String*>(*i++);
+ assert(i == args->end());
+ return new CAST(value);
+ }
if(!strcmp(type_id, "CONSTANT_NAME"))
{
String* value = dynamic_cast<String*>(*i++);
Modified: branches/saturn/src/generated/cmdline.c
==============================================================================
--- branches/saturn/src/generated/cmdline.c (original)
+++ branches/saturn/src/generated/cmdline.c Wed Apr 30 09:09:01 2008
@@ -63,6 +63,7 @@
" --udump=passname Dump input as runnable PHP after the
pass named \n 'passname'",
" --ddump=passname Dump input as DOT after the pass named 'passname'",
" --xdump=passname Dump input as XML after the pass named 'passname'",
+ " --sdump=passname Dump input into Saturn databases after
the pass \n named 'passname'",
" --list-passes List the passes to be run (default=off)",
" --dont-fail Dont fail on error (after parsing) (default=off)",
" --no-xml-attrs When dumping XML, omit node attributes
\n (default=off)",
@@ -154,6 +155,7 @@
args_info->udump_given = 0 ;
args_info->ddump_given = 0 ;
args_info->xdump_given = 0 ;
+ args_info->sdump_given = 0 ;
args_info->list_passes_given = 0 ;
args_info->dont_fail_given = 0 ;
args_info->no_xml_attrs_given = 0 ;
@@ -204,6 +206,8 @@
args_info->ddump_orig = NULL;
args_info->xdump_arg = NULL;
args_info->xdump_orig = NULL;
+ args_info->sdump_arg = NULL;
+ args_info->sdump_orig = NULL;
args_info->list_passes_flag = 0;
args_info->dont_fail_flag = 0;
args_info->no_xml_attrs_flag = 0;
@@ -263,10 +267,13 @@
args_info->xdump_help = gengetopt_args_info_full_help[34] ;
args_info->xdump_min = -1;
args_info->xdump_max = -1;
- args_info->list_passes_help = gengetopt_args_info_full_help[35] ;
- args_info->dont_fail_help = gengetopt_args_info_full_help[36] ;
- args_info->no_xml_attrs_help = gengetopt_args_info_full_help[37] ;
- args_info->disable_help = gengetopt_args_info_full_help[38] ;
+ args_info->sdump_help = gengetopt_args_info_full_help[35] ;
+ args_info->sdump_min = -1;
+ args_info->sdump_max = -1;
+ args_info->list_passes_help = gengetopt_args_info_full_help[36] ;
+ args_info->dont_fail_help = gengetopt_args_info_full_help[37] ;
+ args_info->no_xml_attrs_help = gengetopt_args_info_full_help[38] ;
+ args_info->disable_help = gengetopt_args_info_full_help[39] ;
args_info->disable_min = -1;
args_info->disable_max = -1;
@@ -422,6 +429,7 @@
free_multiple_string_field (args_info->udump_given,
&(args_info->udump_arg), &(args_info->udump_orig));
free_multiple_string_field (args_info->ddump_given,
&(args_info->ddump_arg), &(args_info->ddump_orig));
free_multiple_string_field (args_info->xdump_given,
&(args_info->xdump_arg), &(args_info->xdump_orig));
+ free_multiple_string_field (args_info->sdump_given,
&(args_info->sdump_arg), &(args_info->sdump_orig));
free_multiple_string_field (args_info->disable_given,
&(args_info->disable_arg), &(args_info->disable_orig));
@@ -517,6 +525,7 @@
write_multiple_into_file(outfile, args_info->udump_given, "udump",
args_info->udump_orig, 0);
write_multiple_into_file(outfile, args_info->ddump_given, "ddump",
args_info->ddump_orig, 0);
write_multiple_into_file(outfile, args_info->xdump_given, "xdump",
args_info->xdump_orig, 0);
+ write_multiple_into_file(outfile, args_info->sdump_given, "sdump",
args_info->sdump_orig, 0);
if (args_info->list_passes_given)
write_into_file(outfile, "list-passes", 0, 0 );
if (args_info->dont_fail_given)
@@ -797,6 +806,9 @@
if (check_multiple_option_occurrences(prog_name,
args_info->xdump_given, args_info->xdump_min, args_info->xdump_max, "'--xdump'"))
error = 1;
+ if (check_multiple_option_occurrences(prog_name,
args_info->sdump_given, args_info->sdump_min, args_info->sdump_max, "'--sdump'"))
+ error = 1;
+
if (check_multiple_option_occurrences(prog_name,
args_info->disable_given, args_info->disable_min, args_info->disable_max, "'--disable'"))
error = 1;
@@ -1039,6 +1051,7 @@
struct generic_list * udump_list = NULL;
struct generic_list * ddump_list = NULL;
struct generic_list * xdump_list = NULL;
+ struct generic_list * sdump_list = NULL;
struct generic_list * disable_list = NULL;
int error = 0;
struct gengetopt_args_info local_args_info;
@@ -1100,6 +1113,7 @@
{ "udump", 1, NULL, 0 },
{ "ddump", 1, NULL, 0 },
{ "xdump", 1, NULL, 0 },
+ { "sdump", 1, NULL, 0 },
{ "list-passes", 0, NULL, 0 },
{ "dont-fail", 0, NULL, 0 },
{ "no-xml-attrs", 0, NULL, 0 },
@@ -1449,6 +1463,17 @@
goto failure;
}
+ /* Dump input into Saturn databases after the pass
named 'passname'. */
+ else if (strcmp (long_options[option_index].name, "sdump")
== 0)
+ {
+
+ if (update_multiple_arg_temp(&sdump_list,
+ &(local_args_info.sdump_given), optarg, 0, 0, ARG_STRING,
+ "sdump", '-',
+ additional_error))
+ goto failure;
+
+ }
/* List the passes to be run. */
else if (strcmp
(long_options[option_index].name, "list-passes") == 0)
{
@@ -1541,6 +1566,10 @@
&(args_info->xdump_orig), args_info->xdump_given,
local_args_info.xdump_given, 0 ,
ARG_STRING, xdump_list);
+ update_multiple_arg((void *)&(args_info->sdump_arg),
+ &(args_info->sdump_orig), args_info->sdump_given,
+ local_args_info.sdump_given, 0 ,
+ ARG_STRING, sdump_list);
update_multiple_arg((void *)&(args_info->disable_arg),
&(args_info->disable_orig), args_info->disable_given,
local_args_info.disable_given, 0 ,
@@ -1562,6 +1591,8 @@
local_args_info.ddump_given = 0;
args_info->xdump_given += local_args_info.xdump_given;
local_args_info.xdump_given = 0;
+ args_info->sdump_given += local_args_info.sdump_given;
+ local_args_info.sdump_given = 0;
args_info->disable_given += local_args_info.disable_given;
local_args_info.disable_given = 0;
@@ -1610,6 +1641,7 @@
free_list (udump_list, 1 );
free_list (ddump_list, 1 );
free_list (xdump_list, 1 );
+ free_list (sdump_list, 1 );
free_list (disable_list, 1 );
cmdline_parser_release (&local_args_info);
Modified: branches/saturn/src/generated/cmdline.h
==============================================================================
--- branches/saturn/src/generated/cmdline.h (original)
+++ branches/saturn/src/generated/cmdline.h Wed Apr 30 09:09:01 2008
@@ -119,6 +119,11 @@
int xdump_min; /**< @brief Dump input as XML after the pass
named 'passname''s minimum occurreces */
int xdump_max; /**< @brief Dump input as XML after the pass
named 'passname''s maximum occurreces */
const char *xdump_help; /**< @brief Dump input as XML after the pass
named 'passname' help description. */
+ char ** sdump_arg; /**< @brief Dump input into Saturn databases
after the pass named 'passname'. */
+ char ** sdump_orig; /**< @brief Dump input into Saturn databases
after the pass named 'passname' original value given at command line. */
+ int sdump_min; /**< @brief Dump input into Saturn databases after
the pass named 'passname''s minimum occurreces */
+ int sdump_max; /**< @brief Dump input into Saturn databases after
the pass named 'passname''s maximum occurreces */
+ const char *sdump_help; /**< @brief Dump input into Saturn databases
after the pass named 'passname' help description. */
int list_passes_flag; /**< @brief List the passes to be run
(default=off). */
const char *list_passes_help; /**< @brief List the passes to be run
help description. */
int dont_fail_flag; /**< @brief Dont fail on error (after parsing)
(default=off). */
@@ -161,6 +166,7 @@
unsigned int udump_given ; /**< @brief Whether udump was given. */
unsigned int ddump_given ; /**< @brief Whether ddump was given. */
unsigned int xdump_given ; /**< @brief Whether xdump was given. */
+ unsigned int sdump_given ; /**< @brief Whether sdump was given. */
unsigned int list_passes_given ; /**< @brief Whether list-passes was
given. */
unsigned int dont_fail_given ; /**< @brief Whether dont-fail was
given. */
unsigned int no_xml_attrs_given ; /**< @brief Whether no-xml-attrs
was given. */
Modified: branches/saturn/src/generated_src/ast.tea
==============================================================================
--- branches/saturn/src/generated_src/ast.tea (original)
+++ branches/saturn/src/generated_src/ast.tea Wed Apr 30 09:09:01 2008
@@ -135,7 +135,7 @@
List_element ::= Variable | Nested_list_elements ;
Nested_list_elements ::= List_element?* ;
-Cast ::= CAST<String*> Expr ;
+Cast ::= CAST Expr ;
Unary_op ::= OP Expr ;
Bin_op ::= left:Expr OP right:Expr ;
@@ -176,7 +176,7 @@
Identifier ::=
INTERFACE_NAME | CLASS_NAME | METHOD_NAME | VARIABLE_NAME
- | CAST<String*> | OP | CONSTANT_NAME | LABEL_NAME
+ | CAST | OP | CONSTANT_NAME | LABEL_NAME
| DIRECTIVE_NAME
;
@@ -564,15 +564,6 @@
}
};
-class CAST
-{
-public:
- String* get_value_as_string ()
- {
- return value;
- }
-};
-
class HT_ITERATOR
{
public:
@@ -609,6 +600,18 @@
assert (source_rep != NULL);
attrs->set ("phc.unparser.source_rep", source_rep);
}
+};
+
+class Identifier
+{
+public:
+ virtual String* get_value_as_string() = 0;
+};
+
+class Literal
+{
+public:
+ virtual String* get_value_as_string() = 0;
};
Modified: branches/saturn/src/generated_src/phc.ggo
==============================================================================
--- branches/saturn/src/generated_src/phc.ggo (original)
+++ branches/saturn/src/generated_src/phc.ggo Wed Apr 30 09:09:01 2008
@@ -36,6 +36,7 @@
option "udump" - "Dump input as runnable PHP after the pass
named 'passname'" string typestr="passname" multiple hidden optional
option "ddump" - "Dump input as DOT after the pass named 'passname'"
string typestr="passname" multiple hidden optional
option "xdump" - "Dump input as XML after the pass named 'passname'"
string typestr="passname" multiple hidden optional
+option "sdump" - "Dump input into Saturn databases after the pass
named 'passname'" string typestr="passname" multiple hidden optional
option "list-passes" - "List the passes to be run" flag off hidden
option "dont-fail" - "Dont fail on error (after parsing)" flag off hidden
option "no-xml-attrs" - "When dumping XML, omit node attributes" flag
off hidden
Modified: branches/saturn/src/pass_manager/Pass_manager.cpp
==============================================================================
--- branches/saturn/src/pass_manager/Pass_manager.cpp (original)
+++ branches/saturn/src/pass_manager/Pass_manager.cpp Wed Apr 30
09:09:01 2008
@@ -16,6 +16,7 @@
#include "Transform_pass.h"
#include "process_ir/XML_unparser.h"
+#include "process_ir/CLPA_unparser.h"
#include "process_ast/AST_unparser.h"
#include "process_hir/HIR_unparser.h"
#include "process_mir/MIR_unparser.h"
@@ -353,6 +354,14 @@
in->visit( new AST_XML_unparser (cout, attrs),
new HIR_XML_unparser (cout, attrs),
new MIR_XML_unparser (cout, attrs));
+ }
+ }
+
+ for (unsigned int i = 0; i < args_info->sdump_given; i++)
+ {
+ if (*name == args_info->sdump_arg [i])
+ {
+ in->visit(new AST_CLPA_unparser(), new HIR_CLPA_unparser(), new
MIR_CLPA_unparser ());
}
}
}
Modified: branches/saturn/src/phc.cpp
==============================================================================
--- branches/saturn/src/phc.cpp (original)
+++ branches/saturn/src/phc.cpp Wed Apr 30 09:09:01 2008
@@ -185,6 +185,7 @@
check_passes (udump);
check_passes (xdump);
check_passes (ddump);
+ check_passes (sdump);
check_passes (debug);
check_passes (disable);
Added: branches/saturn/src/process_ir/CLPA_unparser.h
==============================================================================
--- (empty file)
+++ branches/saturn/src/process_ir/CLPA_unparser.h Wed Apr 30 09:09:01 2008
@@ -0,0 +1,256 @@
+/*
+ * phc -- the open source PHP compiler
+ * See doc/license/README.license for licensing information
+ *
+ * Generate syntax databases for the Calypso interpreter.
+ */
+
+#ifndef PHC_CLPA_UNPARSER
+#define PHC_CLPA_UNPARSER
+
+#include <iostream>
+#include <stack>
+#include "lib/base64.h"
+#include "lib/demangle.h"
+#include "lib/error.h"
+#include "lib/String.h"
+#include "lib/List.h"
+
+template
+<
+ class Script,
+ class Node,
+ class Literal,
+ class Identifier,
+ class Visitor
+>
+class CLPA_unparser : public Visitor
+{
+protected:
+ stack<Object*> ids;
+
+public:
+
+/* void visit_marker(char const* name, bool value)
+ {
+ ids.push (new Boolean (value));
+ }
+*/
+ void pre_list(char const* type_id, int size)
+ {
+ cout << "LIST" << endl;
+ cout << "<" << type_id << "_list>" << endl;
+ }
+
+ void post_list(char const* type_id, int size)
+ {
+ cout << "POST_LIST" << endl;
+ cout << "</" << type_id << "_list>" << endl;
+ }
+
+ /* Get an id for this node, and add it to the stack. The magic
+ * happens in post_node. */
+ void pre_node(Node* in)
+ {
+ cdebug << "Adding: " << demangle(in, true);
+ debug(in);
+ cdebug << endl;
+ in->attrs->set ("phc.clpa.id", get_id (in));
+ ids.push (in);
+ }
+
+ void pre_identifier (Identifier* in)
+ {
+ cdebug << "Adding value: " << demangle(in, true);
+ cdebug << endl;
+ ids.push (in->get_value_as_string ());
+ }
+
+ void pre_literal (Literal* in)
+ {
+ cdebug << "Adding value: " << demangle(in, true);
+ cdebug << endl;
+ ids.push (in->get_value_as_string ());
+ }
+
+
+
+ /* If we search backwards down the stack until we find our own
+ * node, then all subnodes will be parameters to this node. */
+ void post_node(Node* in)
+ {
+ cout << "phc_" << demangle(in, false) << " (";
+
+
+ // The params are either IDs or literals
+ List<String*>* params = new List<String*>;
+ while (ids.top () != in)
+ {
+ Object* obj = ids.top();
+ cdebug << "Removing: " << demangle(obj, true);
+
+ // Get IDs for nodes
+ if (dynamic_cast<Literal*> (obj))
+ {
+ Literal* lit = dynamic_cast<Literal*> (obj);
+ debug (lit);
+ cdebug << endl;
+ params->push_back (lit->get_value_as_string ());
+ }
+ else if (dynamic_cast<Node*> (obj))
+ {
+ Node* node = dynamic_cast<Node*> (obj);
+ debug (node);
+ cdebug << endl;
+ params->push_back (node->attrs->get_string ("phc.clpa.id"));
+ }
+/* else if (dynamic_cast<Boolean*> (obj))
+ {
+ Boolean* b = dynamic_cast<Boolean*> (obj);
+ params->push_back (s(b->value() ? "true" : "false"));
+ }
+*/ else if (dynamic_cast<String*> (obj))
+ {
+ String* b = dynamic_cast<String*> (obj);
+ params->push_back (b);
+ }
+ else
+ {
+ cout << "TODO" << endl;
+ assert (0);
+ }
+
+ ids.pop ();
+ }
+
+ List<String*>::const_iterator i = params->begin ();
+ while (i != params->end ())
+ {
+ cout << **i;
+ i++;
+
+ // no comma on final iteration
+ if (i != params->end ())
+ cout << ", ";
+
+ }
+ cout << ")" << endl;
+ }
+
+protected:
+
+ String* get_id (Node* node)
+ {
+ static int id = 0;
+ String* string_id;
+
+ if (node->attrs->has ("phc.clpa.id"))
+ string_id = node->attrs->get_string ("phc.clpa.id");
+ else
+ {
+ stringstream ss;
+ ss << "#" << id;
+ string_id = new String(ss.str());
+ node->attrs->set ("phc.clpa.id", string_id);
+ id++;
+ }
+ return string_id;
+ }
+
+
+ void print_attributes(Node* in)
+ {
+ if(in->attrs->size() == 0)
+ {
+ cout << "<attrs />" << endl;
+ }
+ else
+ {
+ cout << "<attrs>" << endl;
+
+ AttrMap::const_iterator i;
+ for(i = in->attrs->begin(); i != in->attrs->end(); i++)
+ {
+// print_attribute((*i).first, (*i).second);
+ }
+
+ cout << "</attrs>" << endl;
+ }
+ }
+
+ void print_attribute(string name, Object* attr)
+ {
+ if(String* str = dynamic_cast<String*>(attr))
+ {
+ cout << "<attr key=\"" << name << "\">";
+// maybe_encode ("string", str);
+ cout << "</attr>" << endl;
+ }
+ else if(Integer* i = dynamic_cast<Integer*>(attr))
+ {
+ cout << "<attr key=\"" << name << "\"><integer>" << i->value ()
<< "</integer></attr>" << endl;
+ }
+ else if(Boolean* b = dynamic_cast<Boolean*>(attr))
+ {
+ cout << "<attr key=\"" << name << "\"><bool>" <<
(b->value() ? "true" : "false") << "</bool></attr>" << endl;
+ }
+ else if(List<String*>* ls = dynamic_cast<List<String*>*>(attr))
+ {
+ cout << "<attr key=\"" << name << "\"><string_list>" << endl;
+
+ List<String*>::const_iterator j;
+ for(j = ls->begin(); j != ls->end(); j++)
+ {
+// maybe_encode ("string", *j);
+ }
+
+ cout << "</string_list></attr>" << endl;
+ }
+ else if (attr == NULL)
+ {
+ cout << "<!-- skipping NULL attribute " << name << " -->" << endl;
+ }
+ else
+ phc_warning ("Don't know how to deal with attribute '%s' of
type '%s'", name.c_str(), demangle(attr, false));
+ }
+
+};
+
+#include "AST_visitor.h"
+class AST_CLPA_unparser : public CLPA_unparser
+<
+ AST::PHP_script,
+ AST::Node,
+ AST::Literal,
+ AST::Identifier,
+ AST::Visitor
+>
+{
+
+};
+
+#include "HIR_visitor.h"
+class HIR_CLPA_unparser : public CLPA_unparser
+<
+ HIR::PHP_script,
+ HIR::Node,
+ HIR::Literal,
+ HIR::Identifier,
+ HIR::Visitor
+>
+{
+};
+
+#include "MIR_visitor.h"
+class MIR_CLPA_unparser : public CLPA_unparser
+<
+ MIR::PHP_script,
+ MIR::Node,
+ MIR::Literal,
+ MIR::Identifier,
+ MIR::Visitor
+>
+{
+};
+
+#endif // PHC_CLPA_UNPARSER
More information about the phc-internals
mailing list