#ifndef GRAMMAR_H #define GRAMMAR_H #include // size_t enum precedence_flag { PRECEDENCE_LEFT_ASSOC, PRECEDENCE_RIGHT_ASSOC, PRECEDENCE_NO_ASSOC, }; #define PRECEDENCE_NUM(prec) ((prec) >> 2) #define PRECEDENCE_FLAG(prec) ((prec) & 0x3) extern struct production { symbol LHS; symbol *RHS; size_t nRHS; unsigned int precedence; } *grammar; extern size_t total_productions; #include void grammar_print() { for(size_t i = 0; i < total_productions; i++) { printf("%d --> ", grammar[i].LHS); for(size_t j = 0; j < grammar[i].nRHS; j++) printf("%d ", grammar[i].RHS[j]); printf("\n"); } } void grammar_print_cstyle() { for(size_t i = 0; i < total_productions; i++) { printf("{%d, (symbol[]){", grammar[i].LHS); for(size_t j = 0; j < grammar[i].nRHS; j++) printf("%d, ", grammar[i].RHS[j]); printf("}, %zu, %d},\n", grammar[i].nRHS, grammar[i].precedence); } } #endif