%{ #include "symbolMgt.h" #include "treeMgt.h" extern int yylex(void); extern void yyerror(char const *); %} %token '(' ')' ',' ';' '.' '=' %token NEW TREENODE_TYPE JTREE_TYPE ADDOBJECT %token STRINGVALUE SYMBOL %union { char * stringVal; } %% Program: InstructionList { fprintf( stderr, "\n----- Symbol table:\n"); printSymbolTable(); fprintf( stderr, "-----\n" ); /* SPECIFIQUE GRAM5.BISON */ char * treeName; treeName = firstTreeStructSymbolName( ); if( treeName != NULL ) { Tree *tP; TreeNode * tnP; tP = getRefForSymbolInTable(treeName); fprintf(stderr, "get %s = %p\n", treeName, tP); tnP = getNodeFromRoot(tP); fprintf(stderr, "tnP = %p\n", tnP); dfsTraversalOn( "", tnP, "\n-----\n" ); dfsCodeGenForNodeOnFile( 0, tnP, stderr ); } } ; InstructionList : Instruction | InstructionList Instruction ; Instruction : NodeDef | TreeDef | NodeAdd ; NodeDef : TREENODE_TYPE SYMBOL '=' NEW TREENODE_TYPE '(' STRINGVALUE ')' ';' { int p = isInSymbolTable( $2 ); if( p == 1 ) { fprintf( stderr, "%s already defined\n", $2 ); } else { insertInSymbolTable( $2 , TREE_NODE); TreeNode * tnP; tnP = newTreeNode( $7 ); setRefForSymbolInTable($2, tnP); fprintf(stderr, "set %s = %p\n", $2, tnP); } } ; TreeDef : JTREE_TYPE SYMBOL '=' NEW JTREE_TYPE '(' SYMBOL ')' ';' { int p1, p2; p1 = isInSymbolTable( $2 ); if( p1 == 1 ) { fprintf( stderr, "%s already defined\n", $2 ); } else { insertInSymbolTable( $2 , TREE_STRUCT); } p2 = isInSymbolTable( $7 ); if( p2 == 0 ) { fprintf( stderr, "%s referenced but undefined\n", $7 ); } if (!p1 && p2) { TreeNode * tnP; Tree * treeP; tnP = getRefForSymbolInTable( $7 ); fprintf(stderr, "get %s = %p\n", $7, tnP); treeP = newTree( tnP ); fprintf(stderr, "set %s = %p\n", $2, treeP); setRefForSymbolInTable($2, treeP); } } ; NodeAdd : SYMBOL '.' ADDOBJECT '(' SYMBOL ',' SYMBOL ')' ';' { int p1, p2, p3; fprintf( stderr, " : ",$1,$5,$7); p1 = isInSymbolTable( $1 ); if( p1 == 0 ) { fprintf( stderr, "%s (tree) referenced but undefined\n", $1 ); } p2 = isInSymbolTable( $5 ); if( p2 == 0 ) { fprintf( stderr, "%s (node) referenced but undefined\n", $5 ); } p3 = isInSymbolTable( $7 ); if( p3 == 0 ) { fprintf( stderr, "%s (node) referenced but undefined\n", $7 ); } if (p1 && p2 && p3) { void * p = getRefForSymbolInTable($5); fprintf(stderr, "get %s = %p\n", $5, p); void * c = getRefForSymbolInTable($7); fprintf(stderr, "get %s = %p\n", $7, c); if (p != NULL && c != NULL) { addChildToParentNode( p, c ); } else { fprintf(stderr, "Error accessing p (%p) or c (%p)", p, c); } } } ; %%