%{ #include #include "symbolMgt.h" extern int yylex(void); extern void yyerror(char const *); void printValue(char *val) { fprintf(stderr, "%s", val); } %} %union{ char *stringVal; } %error-verbose %token '(' ')' ',' ';' '.' '=' %token NEW TREENODE_TYPE JTREE_TYPE ADDOBJECT %token STRINGVALUE SYMBOL %% Program: InstructionList { fprintf( stderr, "\n----- Symbol table:\n"); printSymbolTable(); fprintf( stderr, "-----\n" ); } ; 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); } } ; TreeDef : JTREE_TYPE SYMBOL '=' NEW JTREE_TYPE '(' SYMBOL ')' ';' { int p; p = isInSymbolTable( $2 ); if( p == 1 ) { fprintf( stderr, "%s already defined\n", $2 ); } else { insertInSymbolTable( $2 , TREE_STRUCT); } p = isInSymbolTable( $7 ); if( p == 0 ) { fprintf( stderr, "%s referenced but undefined\n", $7 ); } } ; NodeAdd : SYMBOL '.' ADDOBJECT '(' SYMBOL ',' SYMBOL ')' ';' { int p; fprintf( stderr, " : ",$1,$5,$7); p = isInSymbolTable( $1 ); if( p == 0 ) { fprintf( stderr, "%s (tree) referenced but undefined\n", $1 ); } p = isInSymbolTable( $5 ); if( p == 0 ) { fprintf( stderr, "%s (node) referenced but undefined\n", $5 ); } p = isInSymbolTable( $7 ); if( p == 0 ) { fprintf( stderr, "%s (node) referenced but undefined\n", $7 ); } } ;