OSDN Git Service

PR c++/10968
[pf3gnuchains/gcc-fork.git] / gcc / c-pretty-print.c
index c861d17..39d7258 100644 (file)
@@ -21,45 +21,61 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
 
 #include "config.h"
 #include "system.h"
+#include "coretypes.h"
+#include "tm.h"
 #include "real.h"
 #include "c-pretty-print.h"
+#include "c-tree.h"
 
 /* literal  */
-static void pp_c_char              PARAMS ((c_pretty_print_info *, int));
-static void pp_c_character_literal PARAMS ((c_pretty_print_info *, tree));
-static void pp_c_bool_literal      PARAMS ((c_pretty_print_info *, tree));
-static bool pp_c_enumerator        PARAMS ((c_pretty_print_info *, tree));
-static void pp_c_integer_literal   PARAMS ((c_pretty_print_info *, tree));
-static void pp_c_real_literal      PARAMS ((c_pretty_print_info *, tree));
-static void pp_c_string_literal    PARAMS ((c_pretty_print_info *, tree));
+static void pp_c_char              PARAMS ((c_pretty_printer, int));
+static void pp_c_character_literal PARAMS ((c_pretty_printer, tree));
+static void pp_c_bool_literal      PARAMS ((c_pretty_printer, tree));
+static bool pp_c_enumerator        PARAMS ((c_pretty_printer, tree));
+static void pp_c_integer_literal   PARAMS ((c_pretty_printer, tree));
+static void pp_c_real_literal      PARAMS ((c_pretty_printer, tree));
+static void pp_c_string_literal    PARAMS ((c_pretty_printer, tree));
 
-static void pp_c_primary_expression PARAMS ((c_pretty_print_info *, tree));
+static void pp_c_primary_expression PARAMS ((c_pretty_printer, tree));
 
 /* postfix-expression  */
-static void pp_c_initializer_list PARAMS ((c_pretty_print_info *, tree));
-
-static void pp_c_unary_expression PARAMS ((c_pretty_print_info *, tree));
-static void pp_c_multiplicative_expression PARAMS ((c_pretty_print_info *,
-                                                   tree));
-static void pp_c_additive_expression PARAMS ((c_pretty_print_info *, tree));
-static void pp_c_shift_expression PARAMS ((c_pretty_print_info *, tree));
-static void pp_c_relational_expression PARAMS ((c_pretty_print_info *, tree));
-static void pp_c_equality_expression PARAMS ((c_pretty_print_info *, tree));
-static void pp_c_and_expression PARAMS ((c_pretty_print_info *, tree));
-static void pp_c_exclusive_or_expression PARAMS ((c_pretty_print_info *,
+static void pp_c_initializer_list        PARAMS ((c_pretty_printer, tree));
+
+static void pp_c_unary_expression        PARAMS ((c_pretty_printer, tree));
+static void pp_c_multiplicative_expression PARAMS ((c_pretty_printer, tree));
+static void pp_c_additive_expression     PARAMS ((c_pretty_printer, tree));
+static void pp_c_shift_expression        PARAMS ((c_pretty_printer, tree));
+static void pp_c_relational_expression   PARAMS ((c_pretty_printer, tree));
+static void pp_c_equality_expression     PARAMS ((c_pretty_printer, tree));
+static void pp_c_and_expression          PARAMS ((c_pretty_printer, tree));
+static void pp_c_exclusive_or_expression PARAMS ((c_pretty_printer,
                                                  tree));
-static void pp_c_inclusive_or_expression PARAMS ((c_pretty_print_info *,
+static void pp_c_inclusive_or_expression PARAMS ((c_pretty_printer,
                                                  tree));
-static void pp_c_logical_and_expression PARAMS ((c_pretty_print_info *, tree));
-static void pp_c_conditional_expression PARAMS ((c_pretty_print_info *, tree));
-static void pp_c_assignment_expression PARAMS ((c_pretty_print_info *, tree));
+static void pp_c_logical_and_expression PARAMS ((c_pretty_printer, tree));
+static void pp_c_conditional_expression PARAMS ((c_pretty_printer, tree));
+static void pp_c_assignment_expression  PARAMS ((c_pretty_printer, tree));
+
+/* declarations.  */
+static void pp_c_declaration_specifiers   PARAMS ((c_pretty_printer, tree));
+static void pp_c_init_declarator          PARAMS ((c_pretty_printer, tree));
+static void pp_c_declarator               PARAMS ((c_pretty_printer, tree));
+static void pp_c_direct_declarator        PARAMS ((c_pretty_printer, tree));
+static void pp_c_abstract_declarator      PARAMS ((c_pretty_printer, tree));
+static void pp_c_specifier_qualifier_list PARAMS ((c_pretty_printer, tree));
+static void pp_c_simple_type_specifier    PARAMS ((c_pretty_printer, tree));
+static void pp_c_parameter_declaration    PARAMS ((c_pretty_printer, tree));
+static void pp_c_type_id                  PARAMS ((c_pretty_printer, tree));
+static void pp_c_storage_class_specifier  PARAMS ((c_pretty_printer, tree));
+static void pp_c_function_specifier       PARAMS ((c_pretty_printer, tree));
+
 \f
 /* Declarations.  */
 
-/* Print out CV-qualifiers.  Take care of possible extension.  */
+/* Print out CV-qualifiers.  Take care of possible extensions.  */
 void
 pp_c_cv_qualifier (ppi, cv)
-     c_pretty_print_info *ppi;
+     c_pretty_printer ppi;
      int cv;
 {
   if (cv & TYPE_QUAL_CONST)
@@ -70,13 +86,217 @@ pp_c_cv_qualifier (ppi, cv)
     pp_c_identifier (ppi, flag_isoc99 ? "restrict" : "__restrict__");
 }
 
+static void
+pp_c_simple_type_specifier (ppi, t)
+     c_pretty_printer ppi;
+     tree t;
+{
+  const enum tree_code code = TREE_CODE (t);
+  switch (code)
+    {
+    case ERROR_MARK:
+      pp_c_identifier (ppi, "<type-error>");
+      break;
+
+#if 0
+    case UNKNOWN_TYPE:
+      pp_c_identifier (ppi, "<unkown-type>");
+      break;
+#endif
+
+    case IDENTIFIER_NODE:
+      pp_c_tree_identifier (ppi, t);
+      break;
+      
+    case VOID_TYPE:
+    case BOOLEAN_TYPE:
+    case CHAR_TYPE:
+    case INTEGER_TYPE:
+    case REAL_TYPE:
+      pp_c_tree_identifier (ppi, DECL_NAME (t));
+      break;
+      
+    case COMPLEX_TYPE:
+    case VECTOR_TYPE:
+      pp_c_simple_type_specifier (ppi, TYPE_MAIN_VARIANT (TREE_TYPE (t)));
+      if (code == COMPLEX_TYPE)
+       pp_c_identifier (ppi, flag_isoc99 ? "_Complex" : "__complex__");
+      else if (code == VECTOR_TYPE)
+       pp_c_identifier (ppi, "__vector__");
+      break;
+
+    case TYPE_DECL:
+      if (DECL_NAME (t))
+       pp_c_tree_identifier (ppi, DECL_NAME (t));
+      else
+       pp_c_identifier (ppi, "<typedef-error>");
+      break;
+
+    case UNION_TYPE:
+    case RECORD_TYPE:
+    case ENUMERAL_TYPE:
+      if (code == UNION_TYPE)
+       pp_c_identifier (ppi, "union");
+      else if (code == RECORD_TYPE)
+       pp_c_identifier (ppi, "struct");
+      else if (code == ENUMERAL_TYPE)
+       pp_c_identifier (ppi, "enum");
+      else
+       pp_c_identifier (ppi, "<tag-error>");
+      
+      if (TYPE_NAME (t))
+       pp_c_tree_identifier (ppi, TYPE_NAME (t));
+      else
+       pp_c_identifier (ppi, "<anonymous>");
+      break;
+
+    default:
+      pp_unsupported_tree (ppi, t);
+    }
+}
+
+static inline void
+pp_c_specifier_qualifier_list (ppi, t)
+     c_pretty_printer ppi;
+     tree t;
+{
+  pp_c_simple_type_specifier (ppi, TYPE_MAIN_VARIANT (TREE_TYPE (t)));
+  pp_c_cv_qualifier (ppi, TYPE_QUALS (t));
+}
+
+static void
+pp_c_abstract_declarator (ppi, t)
+     c_pretty_printer ppi;
+     tree t;
+{
+  pp_unsupported_tree (ppi, t);
+}
+
+
+static inline void
+pp_c_type_id (ppi, t)
+     c_pretty_printer ppi;
+     tree t;
+{
+  pp_c_specifier_qualifier_list (ppi, t);
+  pp_c_abstract_declarator (ppi, t);
+}
+
+static inline void
+pp_c_storage_class_specifier (pp, t)
+     c_pretty_printer pp;
+     tree t;
+{
+  if (TREE_CODE (t) == TYPE_DECL)
+    pp_c_identifier (pp, "typedef");
+  else if (DECL_REGISTER (t))
+    pp_c_identifier (pp, "register");
+}
+
+static inline void
+pp_c_function_specifier (pp, t)
+     c_pretty_printer pp;
+     tree t;
+{
+  if (TREE_CODE (t) == FUNCTION_DECL && DECL_DECLARED_INLINE_P (t))
+    pp_c_identifier (pp, "inline");
+}
+
+static inline void
+pp_c_declaration_specifiers (pp, t)
+     c_pretty_printer pp;
+     tree t;
+{
+  pp_c_storage_class_specifier (pp, t);
+  pp_c_function_specifier (pp, t);
+  pp_type_specifier (pp, TYPE_MAIN_VARIANT (TREE_TYPE (t)));
+  pp_c_cv_qualifier (pp, TYPE_QUALS (TREE_TYPE (t)));
+}
+
+static inline void
+pp_c_direct_declarator (pp, t)
+     c_pretty_printer pp;
+     tree t;
+{
+  pp_unsupported_tree (pp, t);
+}
+
+static inline void
+pp_c_declarator (pp, t)
+     c_pretty_printer pp;
+     tree t;
+{
+  pp_unsupported_tree (pp, t);
+}
+
+static inline void
+pp_c_init_declarator (pp, t)
+     c_pretty_printer pp;
+     tree t;
+{
+  pp_declarator (pp, t);
+  if (DECL_INITIAL (t))
+    {
+      pp_whitespace (pp);
+      pp_equal (pp);
+      pp_whitespace (pp);
+      pp_c_initializer (pp, DECL_INITIAL (t));
+    }
+}
+
+void
+pp_c_declaration (pp, t)
+     c_pretty_printer pp;
+     tree t;
+{
+  pp_declaration_specifiers (pp, t);
+  pp_c_init_declarator (pp, t);
+}
+
+static void
+pp_c_parameter_declaration (pp, t)
+     c_pretty_printer pp;
+     tree t;
+{
+  pp_unsupported_tree (pp, t);
+}
+
+/* Pretty-print ATTRIBUTES using GNU C extension syntax.  */
+void 
+pp_c_attributes (pp, attributes)
+     c_pretty_printer pp;
+     tree attributes;
+{
+  if (attributes == NULL_TREE)
+    return;
+  
+  pp_c_identifier (pp, "__attribute__");
+  pp_c_left_paren (pp); 
+  pp_c_left_paren (pp);
+  for (; attributes != NULL_TREE; attributes = TREE_CHAIN (attributes))
+    {
+      pp_tree_identifier (pp, TREE_PURPOSE (attributes));
+      if (TREE_VALUE (attributes))
+       {
+         pp_c_left_paren (pp);
+         pp_c_expression_list (pp, TREE_VALUE (attributes));
+         pp_c_right_paren (pp);
+       }
+      
+      if (TREE_CHAIN (attributes))
+       pp_separate_with (pp, ',');
+    }
+  pp_c_right_paren (pp);
+  pp_c_right_paren (pp);
+}
+
 \f
 /* Expressions.  */
 
 /* Print out a c-char.  */
 static void
 pp_c_char (ppi, c)
-     c_pretty_print_info *ppi;
+     c_pretty_printer ppi;
      int c;
 {
   switch (c)
@@ -115,7 +335,7 @@ pp_c_char (ppi, c)
       if (ISPRINT (c))
        pp_character (ppi, c);
       else
-       pp_format_integer (ppi, "\\%03o", (unsigned) c);
+       pp_format_scalar (ppi, "\\%03o", (unsigned) c);
       break;
     }
 }
@@ -123,7 +343,7 @@ pp_c_char (ppi, c)
 /* Print out a STRING literal.  */
 static inline void
 pp_c_string_literal (ppi, s)
-     c_pretty_print_info *ppi;
+     c_pretty_printer ppi;
      tree s;
 {
   const char *p = TREE_STRING_POINTER (s);
@@ -138,7 +358,7 @@ pp_c_string_literal (ppi, s)
 /* Print out a CHARACTER literal.  */
 static inline void
 pp_c_character_literal (ppi, c)
-     c_pretty_print_info *ppi;
+     c_pretty_printer ppi;
      tree c;
 {
   pp_quote (ppi);
@@ -149,7 +369,7 @@ pp_c_character_literal (ppi, c)
 /* Print out a BOOLEAN literal.  */
 static inline void
 pp_c_bool_literal (ppi, b)
-     c_pretty_print_info *ppi;
+     c_pretty_printer ppi;
      tree b;
 {
   if (b == boolean_false_node || integer_zerop (b))
@@ -180,7 +400,7 @@ pp_c_bool_literal (ppi, b)
    is then printed by pp_c_integer_literal.  */
 static bool
 pp_c_enumerator (ppi, e)
-     c_pretty_print_info *ppi;
+     c_pretty_printer ppi;
      tree e;
 {
   tree type = TREE_TYPE (e);
@@ -209,7 +429,7 @@ pp_c_enumerator (ppi, e)
 /* Print out an INTEGER constant value.  */
 static void
 pp_c_integer_literal (ppi, i)
-     c_pretty_print_info *ppi;
+     c_pretty_printer ppi;
      tree i;
 {
   tree type = TREE_TYPE (i);
@@ -229,14 +449,11 @@ pp_c_integer_literal (ppi, i)
        {
          if (tree_int_cst_sgn (i) < 0)
            {
-             static char format[10]; /* "%x%09999x\0" */
-             if (!format[0])
-               sprintf (format, "%%x%%0%dx", HOST_BITS_PER_INT / 4);
-
              pp_c_char (ppi, '-');
              i = build_int_2 (-TREE_INT_CST_LOW (i),
                               ~TREE_INT_CST_HIGH (i) + !TREE_INT_CST_LOW (i));
-             sprintf (pp_buffer (ppi)->digit_buffer, format, 
+             sprintf (pp_buffer (ppi)->digit_buffer,
+                      HOST_WIDE_INT_PRINT_DOUBLE_HEX, 
                       TREE_INT_CST_HIGH (i), TREE_INT_CST_LOW (i));
              pp_identifier (ppi, pp_buffer (ppi)->digit_buffer);
 
@@ -245,21 +462,21 @@ pp_c_integer_literal (ppi, i)
     }
 }
 
-/* Print out a REAL value. */
+/* Print out a REAL value.  */
 static inline void
 pp_c_real_literal (ppi, r)
-     c_pretty_print_info *ppi;
+     c_pretty_printer ppi;
      tree r;
 {
-  REAL_VALUE_TO_DECIMAL (TREE_REAL_CST (r), "%.16g",
-                        pp_buffer (ppi)->digit_buffer);
+  real_to_decimal (pp_buffer (ppi)->digit_buffer, &TREE_REAL_CST (r),
+                  sizeof (pp_buffer (ppi)->digit_buffer), 0, 1);
   pp_identifier (ppi, pp_buffer(ppi)->digit_buffer);
 }
 
 
 void
 pp_c_literal (ppi, e)
-     c_pretty_print_info *ppi;
+     c_pretty_printer ppi;
      tree e;
 {
   switch (TREE_CODE (e))
@@ -285,7 +502,7 @@ pp_c_literal (ppi, e)
 /* Pretty-print a C primary-expression.  */
 static void
 pp_c_primary_expression (ppi, e)
-     c_pretty_print_info *ppi;
+     c_pretty_printer ppi;
      tree e;
 {
   switch (TREE_CODE (e))
@@ -339,7 +556,7 @@ pp_c_primary_expression (ppi, e)
       break;
 
     default:
-      /*  Make sure this call won't cause any infinite loop. */
+      /*  Make sure this call won't cause any infinite loop.  */
       pp_c_left_paren (ppi);
       pp_c_expression (ppi, e);
       pp_c_right_paren (ppi);
@@ -350,7 +567,7 @@ pp_c_primary_expression (ppi, e)
 /* Print out a C initializer -- also support C compound-literals.  */
 void
 pp_c_initializer (ppi, e)
-     c_pretty_print_info *ppi;
+     c_pretty_printer ppi;
      tree e;
 {
   if (TREE_CODE (e) == CONSTRUCTOR)
@@ -371,7 +588,7 @@ pp_c_initializer (ppi, e)
 
 static void
 pp_c_initializer_list (ppi, e)
-     c_pretty_print_info *ppi;
+     c_pretty_printer ppi;
      tree e;
 {
   tree type = TREE_TYPE (e);
@@ -408,7 +625,7 @@ pp_c_initializer_list (ppi, e)
 
 void
 pp_c_postfix_expression (ppi, e)
-     c_pretty_print_info *ppi;
+     c_pretty_printer ppi;
      tree e;
 {
   enum tree_code code = TREE_CODE (e);
@@ -498,30 +715,6 @@ pp_c_postfix_expression (ppi, e)
       pp_initializer (ppi, e);
       break;
       
-#if 0
-    case SRCLOC:
-      pp_left_paren (ppi);
-      pp_identifier (ppi, "__location__");
-      pp_right_paren (ppi);
-      pp_whitespace (ppi);
-      pp_left_brace (ppi);
-      pp_dot (ppi);
-      pp_identifier (ppi, "file");
-      pp_whitespace (ppi);
-      pp_equal (ppi);
-      pp_c_whitespace (ppi);
-      pp_c_expression (ppi, SRCLOC_FILE (e));
-      pp_separate_with (ppi, ',');
-      pp_dot (ppi);
-      pp_identifier (ppi, "line");
-      pp_whitespace (ppi);
-      pp_equal (ppi);
-      pp_c_whitespace (ppi);
-      pp_c_expression (ppi, SRCLOC_LINE (e));
-      pp_right_brace (ppi);
-      break;
-#endif
-
     case VA_ARG_EXPR:
       pp_c_identifier (ppi, "__builtin_va_arg");
       pp_c_left_paren (ppi);
@@ -540,7 +733,7 @@ pp_c_postfix_expression (ppi, e)
 /* Print out an expression-list; E is expected to be a TREE_LIST  */
 void
 pp_c_expression_list (ppi, e)
-     c_pretty_print_info *ppi;
+     c_pretty_printer ppi;
      tree e;
 {
   for (; e != NULL_TREE; e = TREE_CHAIN (e))
@@ -553,7 +746,7 @@ pp_c_expression_list (ppi, e)
 
 static void
 pp_c_unary_expression (ppi, e)
-     c_pretty_print_info *ppi;
+     c_pretty_printer ppi;
      tree e;
 {
   enum tree_code code = TREE_CODE (e);
@@ -614,7 +807,7 @@ pp_c_unary_expression (ppi, e)
 
 void
 pp_c_cast_expression (ppi, e)
-     c_pretty_print_info *ppi;
+     c_pretty_printer ppi;
      tree e;
 {
   if (TREE_CODE (e) == CONVERT_EXPR || TREE_CODE (e) == FLOAT_EXPR)
@@ -630,7 +823,7 @@ pp_c_cast_expression (ppi, e)
 
 static void
 pp_c_multiplicative_expression (ppi, e)
-     c_pretty_print_info *ppi;
+     c_pretty_printer ppi;
      tree e;
 {
   enum tree_code code = TREE_CODE (e);
@@ -659,7 +852,7 @@ pp_c_multiplicative_expression (ppi, e)
 
 static inline void
 pp_c_additive_expression (ppi, e)
-     c_pretty_print_info *ppi;
+     c_pretty_printer ppi;
      tree e;
 {
   enum tree_code code = TREE_CODE (e);
@@ -685,7 +878,7 @@ pp_c_additive_expression (ppi, e)
 
 static inline void
 pp_c_shift_expression (ppi, e)
-     c_pretty_print_info *ppi;
+     c_pretty_printer ppi;
      tree e;
 {
   enum tree_code code = TREE_CODE (e);
@@ -707,7 +900,7 @@ pp_c_shift_expression (ppi, e)
 
 static void
 pp_c_relational_expression (ppi, e)
-     c_pretty_print_info *ppi;
+     c_pretty_printer ppi;
      tree e;
 {
   enum tree_code code = TREE_CODE (e);
@@ -739,7 +932,7 @@ pp_c_relational_expression (ppi, e)
 
 static inline void
 pp_c_equality_expression (ppi, e)
-     c_pretty_print_info *ppi;
+     c_pretty_printer ppi;
      tree e;
 {
   enum tree_code code = TREE_CODE (e);
@@ -762,7 +955,7 @@ pp_c_equality_expression (ppi, e)
 
 static inline void
 pp_c_and_expression (ppi, e)
-     c_pretty_print_info *ppi;
+     c_pretty_printer ppi;
      tree e;
 {
   if (TREE_CODE (e) == BIT_AND_EXPR)
@@ -779,7 +972,7 @@ pp_c_and_expression (ppi, e)
 
 static inline void
 pp_c_exclusive_or_expression (ppi, e)
-     c_pretty_print_info *ppi;
+     c_pretty_printer ppi;
      tree e;
 {
   if (TREE_CODE (e) == BIT_XOR_EXPR)
@@ -796,7 +989,7 @@ pp_c_exclusive_or_expression (ppi, e)
 
 static inline void
 pp_c_inclusive_or_expression (ppi, e)
-     c_pretty_print_info *ppi;
+     c_pretty_printer ppi;
      tree e;
 {
   if (TREE_CODE (e) == BIT_IOR_EXPR)
@@ -813,7 +1006,7 @@ pp_c_inclusive_or_expression (ppi, e)
 
 static inline void
 pp_c_logical_and_expression (ppi, e)
-     c_pretty_print_info *ppi;
+     c_pretty_printer ppi;
      tree e;
 {
   if (TREE_CODE (e) == TRUTH_ANDIF_EXPR)
@@ -830,7 +1023,7 @@ pp_c_logical_and_expression (ppi, e)
 
 void
 pp_c_logical_or_expression (ppi, e)
-     c_pretty_print_info *ppi;
+     c_pretty_printer ppi;
      tree e;
 {
   if (TREE_CODE (e) == TRUTH_ORIF_EXPR)
@@ -847,7 +1040,7 @@ pp_c_logical_or_expression (ppi, e)
 
 static void
 pp_c_conditional_expression (ppi, e)
-     c_pretty_print_info *ppi;
+     c_pretty_printer ppi;
      tree e;
 {
   if (TREE_CODE (e) == COND_EXPR)
@@ -870,7 +1063,7 @@ pp_c_conditional_expression (ppi, e)
 /* Pretty-print a C assignment-expression.  */
 static void
 pp_c_assignment_expression (ppi, e)
-     c_pretty_print_info *ppi;
+     c_pretty_printer ppi;
      tree e;
 {
   if (TREE_CODE (e) == MODIFY_EXPR || TREE_CODE (e) == INIT_EXPR)
@@ -888,7 +1081,7 @@ pp_c_assignment_expression (ppi, e)
 /* Pretty-print an expression.  */
 void
 pp_c_expression (ppi, e)
-     c_pretty_print_info *ppi;
+     c_pretty_printer ppi;
      tree e;
 {
   switch (TREE_CODE (e))
@@ -1025,7 +1218,7 @@ pp_c_expression (ppi, e)
 /* Statements.  */
 void
 pp_c_statement (ppi, stmt)
-     c_pretty_print_info *ppi;
+     c_pretty_printer ppi;
      tree stmt;
 {
   const enum tree_code code = TREE_CODE (stmt);
@@ -1166,7 +1359,7 @@ pp_c_statement (ppi, stmt)
     case GOTO_STMT:
       {
        tree e = code == RETURN_STMT 
-         ? RETURN_EXPR (stmt)
+         ? RETURN_STMT_EXPR (stmt)
          : GOTO_DESTINATION (stmt);
 
        pp_newline (ppi);
@@ -1247,3 +1440,29 @@ pp_c_statement (ppi, stmt)
 
 }
 
+\f
+/* Initialize the PRETTY-PRINTER for handling C codes.  */
+void
+pp_c_pretty_printer_init (pp)
+     c_pretty_printer pp;
+{
+  pp->offset_list               = 0;
+
+  pp->declaration               = pp_c_declaration;
+  pp->declaration_specifiers    = pp_c_declaration_specifiers;
+  pp->type_specifier            = pp_c_simple_type_specifier;
+  pp->declarator                = pp_c_declarator;
+  pp->direct_declarator         = pp_c_direct_declarator;
+  pp->parameter_declaration     = pp_c_parameter_declaration;
+  pp->type_id                   = pp_c_type_id;
+
+  pp->statement                 = pp_c_statement;
+
+  pp->primary_expression        = pp_c_primary_expression;
+  pp->postfix_expression        = pp_c_postfix_expression;
+  pp->unary_expression          = pp_c_unary_expression;
+  pp->initializer               = pp_c_initializer;
+  pp->multiplicative_expression = pp_c_multiplicative_expression;
+  pp->conditional_expression    = pp_c_conditional_expression;
+  pp->assignment_expression     = pp_c_assignment_expression;
+}