This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Re: can you help me?
- From: Mark Dettinger <mdetting at yahoo dot com>
- To: gcc at gcc dot gnu dot org
- Date: Fri, 26 Apr 2002 08:11:01 -0700 (PDT)
- Subject: 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/