This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: can you help me?


I'm currently trying to get familiar with the tree structure myself and
just started writing a function that outputs the syntax tree of a statement 
in a LISP-like format. The code is still under construction, but here's what 
I have so far. Maybe it already helps you.

Usage: Call print_stmt(stmt,0) where stmt is the pointer to the root
       of the statement's tree.


void println_expr (tree expr) {
  print_expr(expr);
  fprintf(stderr,"\n");
}

void print_string_constant (char* s) {
  char* p;
  fprintf (stderr, "\"");
  for (p=s; *p; p++) {
    if (*p=='\n')
      fprintf (stderr, "\\n");
    else {
      fputc (*p, stderr);
    }
  }
  fprintf (stderr, "\"");
}

void print_expr_operator (int code) {
  switch (code) {
  case MODIFY_EXPR:
    fprintf(stderr,"=");
    break;
  case PLUS_EXPR:
    fprintf(stderr,"+");
    break;
  case MINUS_EXPR:
    fprintf(stderr,"-");
    break;
  case MULT_EXPR:
    fprintf(stderr,"*");
    break;
  case LSHIFT_EXPR:
    fprintf(stderr,"<<");
    break;
  case RSHIFT_EXPR:
    fprintf(stderr,">>");
    break;
  case EQ_EXPR:
    fprintf(stderr,"==");
    break;
  case LT_EXPR:
    fprintf(stderr,"<");
    break;
  case GT_EXPR:
    fprintf(stderr,">");
    break;
  case LE_EXPR:
    fprintf(stderr,"<=");
    break;
  case GE_EXPR:
    fprintf(stderr,">=");
    break;
  case CALL_EXPR:
    fprintf(stderr,"call");
    break;
  case ADDR_EXPR:
    fprintf(stderr,"&");
    break;
  case NOP_EXPR:
    fprintf(stderr,"nop");
    break;
  case POSTINCREMENT_EXPR:
    fprintf(stderr,"post++");
    break;
  case POSTDECREMENT_EXPR:
    fprintf(stderr,"post--");
    break;
  case PREINCREMENT_EXPR:
    fprintf(stderr,"pre++");
    break;
  case PREDECREMENT_EXPR:
    fprintf(stderr,"pre--");
    break;
  default:
    fprintf(stderr,"%s", tree_code_name[code]);
  }
}

void print_expr (tree expr) {
  int code;

  if (expr==NULL) return;
  code = TREE_CODE(expr);
  if (code>NUM_TREE_CODES) {
    fprintf(stderr,"(unknown expression of kind %d)",code);
    return;
  }
  switch (code) {
  case INTEGER_CST:
    fprintf(stderr,"%d",TREE_INT_CST_LOW(expr));
    break;
  case STRING_CST:
    print_string_constant(TREE_STRING_POINTER(expr));
    break;
  case VAR_DECL:
  case PARM_DECL:
  case FUNCTION_DECL:
    print_expr(DECL_NAME(expr));
    break;
  case IDENTIFIER_NODE:
    if (expr!=NULL)
      fprintf(stderr,"%s",IDENTIFIER_POINTER(expr));
    break;
  case TREE_LIST:
    fprintf(stderr,"(list ");
    print_expr_list(expr);
    fprintf(stderr,")");
    break;
  default:
    fprintf(stderr,"(");
    print_expr_operator(code);
    print_expr_operands(expr);
    fprintf(stderr,")");
  }
}

void print_expr_operands (tree expr) {
  int i;
  for (i=0; i<tree_code_length[TREE_CODE(expr)]; i++) {
    fprintf(stderr," ");
    print_expr(TREE_OPERAND(expr,i));
  }
}

void print_expr_list (tree expr) {
  tree exp;
  for (exp = expr; exp != 0; exp = TREE_CHAIN (exp)) {
    fprintf(stderr," ");
    print_expr(TREE_VALUE(exp));
  }
}

void print_simple_stmt (tree stmt, int indent) 
{
  switch (TREE_CODE(stmt)) {
  case DECL_STMT:
    fprintf(stderr,"(decl ");
    print_expr(DECL_STMT_DECL(stmt));
    fprintf(stderr,")");
    break;
  case RETURN_STMT:
    fprintf(stderr,"(return ");
    print_expr(RETURN_EXPR(stmt));
    fprintf(stderr,")");
    break;
  case EXPR_STMT:
    fprintf(stderr,"(expr ");
    print_expr(EXPR_STMT_EXPR(stmt));
    fprintf(stderr,")");
    break;
  case SCOPE_STMT:
    fprintf(stderr,"(scope)");
    break;
  case IF_STMT:
    fprintf(stderr,"(if ");
    print_expr(IF_COND(stmt));
    fprintf(stderr,"\n");
    print_stmt(THEN_CLAUSE(stmt),indent+1);
    if (ELSE_CLAUSE(stmt)) {
      print_spaces(indent);
      fprintf(stderr,"else\n");
      print_stmt(ELSE_CLAUSE(stmt),indent+1);
    }
    print_spaces(indent);
    fprintf(stderr,")");
    break;
  case WHILE_STMT:
    fprintf(stderr,"(while)");
    break;
  case FOR_STMT:
    fprintf(stderr,"(for ");
    print_simple_stmt(FOR_INIT_STMT(stmt),0);
    fprintf(stderr," ");
    print_expr(FOR_COND(stmt));
    fprintf(stderr," ");
    print_expr(FOR_EXPR(stmt));
    fprintf(stderr,"\n");
    print_stmt(FOR_BODY(stmt),indent+1);
    print_spaces(indent);
    fprintf(stderr,")");
    break;
  default:
    fprintf(stderr,"(statement of kind %d)",TREE_CODE(stmt));
  }
}

void print_spaces (int n) 
{
  int i;
  for (i=0; i<n; i++)
    fprintf(stderr,"  ");
}

void print_stmt (tree stmt, int indent) 
{
  print_spaces(indent);
  switch (TREE_CODE(stmt)) {
  case COMPOUND_STMT:
    fprintf(stderr,"(compound\n");
    print_stmt_chain(COMPOUND_BODY(stmt),indent+1);
    fprintf(stderr,")");
    break;
  default:
    print_simple_stmt(stmt,indent);
  }
  fprintf(stderr,"\n");
}

void print_stmt_chain (tree stmt, int indent) 
{
  while (stmt && stmt != error_mark_node) {
    print_stmt(stmt,indent);
    stmt = TREE_CHAIN(stmt);
  }
}


__________________________________________________
Do You Yahoo!?
Yahoo! Games - play chess, backgammon, pool and more
http://games.yahoo.com/


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]