Printing a parse tree

Discussion in 'C' started by munday63, Apr 8, 2008.

  1. munday63

    munday63 New Member

    Joined:
    Mar 26, 2008
    Messages:
    1
    Likes Received:
    0
    Trophy Points:
    0
    Hi,

    I have the following yacc code, and need to print out the parse tree created using the newnode. I need to print the tree using a printtree function.

    Can anyone help me to create the printtree function?

    This is my lex code:
    Code:
    %%
    [01]            return(CONST);
    [a-z]           return(VARIA);
    "<=>"           return(EQUIV);
    "=>"            return(IMPLY);
    "|"             return(OR);
    "&"             return(AND);
    "~"             return(NOT);
    [PRE]           return(KEY);
    [C][1-7]        return(LEVEL);
    [ \t\n]                 ;
    "("             return(LBRAC);
    ")"             return(RBRAC);
    ";"             return(END);
    "{"             return(LCURL);
    "}"             return(RCURL);
    .               printf( "Unexpected: %s\n", yytext);
    %%
    
    This is my yacc code:

    Code:
    typedef struct node *noderef;
    
    union nodeorval {
            noderef nodeval;
            int intval;
            char *strval;
            };
    
    struct node {
            char nodetype;
            union nodeorval leftarg, rightarg;
            };
    
    #define NIL     (noderef) 0
    
    noderef newnode(char sym, noderef l, noderef r)
            {
            noderef new;
            new = (noderef) malloc (sizeof (struct node));
            new -> nodetype = sym;
            new -> leftarg.nodeval = l;
            new -> rightarg.nodeval = r;
            return new;
            };
    
    %start task
    
    %union {
            int tokenval;
            noderef nodeval;
            }
    
    %token  LEVEL KEY CONST VARIA LCURL RCURL END LBRAC RBRAC
    %left EQUIV
    %right IMPLY
    %left AND OR
    %nonassoc NOT
    
    %type <nodeval> wff expr
    
    %%
    task    :       taskid LCURL wfflist RCURL
            |       error           {printf("TASK-P>Error\n");}
            ;
    taskid  :       LEVEL
            |       KEY
            |       error           {printf("TASK-P>Error\n");}
            ;
    wfflist :       wff wfflist
            |       wff
            ;
    wff     :       expr END        {printf("TASK-P>Success\n");
                                            printtree($1);}
            |       error END       {printf("TASK-P>Error\n");}
            ;
    expr    :       CONST
                            {$$ = newnode(yytext[0],NIL,NIL);}
            |       VARIA
                            {$$ = newnode(yytext[0],NIL,NIL);}
            |       expr EQUIV expr
                            {$$ = newnode('E',$1,$3);}
            |       expr IMPLY expr
                            {$$ = newnode('I',$1,$3);}
            |       expr OR expr
                            {$$ = newnode('|',$1,$3);}
            |       expr AND expr
                            {$$ = newnode('&',$1,$3);}
            |       NOT expr
                            {$$ = newnode('~',NIL,$2);}
            |       LBRAC expr RBRAC
                            {$$ = $2;}
            ;
    %%
    
    /*void yyerror(char *err){
            fprintf(stderr, "%s\n", err);
            }
    
    int main(void){
            return yyparse();
    }*/
    
    #include "lex.yy.c"
    
     
  2. chii

    chii New Member

    Joined:
    Apr 17, 2008
    Messages:
    2
    Likes Received:
    0
    Trophy Points:
    0
    Hey, im assuming your from the UEA taking the computing science course, doing the unix coursework assigned by pierre chardiere.
     
  3. shabbir

    shabbir Administrator Staff Member

    Joined:
    Jul 12, 2004
    Messages:
    15,375
    Likes Received:
    388
    Trophy Points:
    83
    We have a seperate forum for introduction and do not jump into any thread with your intro.
     
  4. chii

    chii New Member

    Joined:
    Apr 17, 2008
    Messages:
    2
    Likes Received:
    0
    Trophy Points:
    0
    stfu admin
     

Share This Page

  1. This site uses cookies to help personalise content, tailor your experience and to keep you logged in if you register.
    By continuing to use this site, you are consenting to our use of cookies.
    Dismiss Notice