/** * Function representing the <funct_def> productions */ void RecursiveDescentParser::funct_def() { if(errorCondition) return; if(token == TK_VOID || token == TK_INT || token == TK_CHAR) { #if DEBUG_PARSER std::cout << "<funct_def> --> <f_type><f_name>(<par_list>)<par_dec_list><comp_st>\n"; #endif Type t = f_type(); Token name = f_name(); std::string label = (name == TK_MAIN) ? mainLabel : iCode.getNextLabel(); iCode.threeAddressCode(label); FunctionEntry* entry = new FunctionEntry(); entry->setReturnType(t); entry->setLabel(label); currentReturnLabel = iCode.getNextLabel(); match(TK_LEFT_PARENTHESES); par_list(); match(TK_RIGHT_PARENTHESES); if(symTab.search(name)) { // oops a function with this name has already been declared std::stringstream msg; msg << "Duplicate function declaration '" << name.getValue() << "'"; errorHandler(msg.str(), name); } else { symTab.insert(name, entry); } symTab.createNewTable(); ParamList* pList = par_dec_list(); entry->setParameterList(pList); iCode.threeAddressCode(TAC_SAVE_RET_ADDR); iCode.threeAddressCode(TAC_SAVE_OLD_TOPSTK); iCode.threeAddressCode(TAC_SET_NEW_TOPSTK); comp_st(false); /* since we explicitely called createNewTable we don't want comp_st to create another */ iCode.threeAddressCode(currentReturnLabel); iCode.threeAddressCode(TAC_RESTORE_RET_ADDR); iCode.threeAddressCode(TAC_RESTORE_OLD_TOPSTK); iCode.threeAddressCode(TAC_GOTO_RETADDR); } else { errorHandler(); } }
int main(int argc, char *argv[]) { char *tarfile = NULL; char *rootdir = NULL; int c; int mode = 0; libtar_list_t *l; int return_code = -2; while ((c = getopt(argc, argv, "clvVxh")) != -1) { switch (c) { case 'v': puts("libmavpar " PACKAGE_VERSION "\nCopyright 2015-2016 Mavicona, Quenza Inc.\n"); break; case 'c': if (mode) { usage(argv[0]); return 1; } mode = MODE_CREATE; break; case 'x': if (mode){ usage(argv[0]); return 1; } mode = MODE_EXTRACT; break; case 'l': if (mode) { usage(argv[0]); return 1; } mode = MODE_LIST; break; case 'h': default: usage(argv[0]); return 1; } } if (!mode || ((argc - optind) < (mode == MODE_CREATE ? 2 : 1))) { usage(argv[0]); return 2; } switch (mode) { case MODE_EXTRACT: return_code = par_extract(argv[optind], rootdir); break; case MODE_CREATE: tarfile = argv[optind]; l = libtar_list_new(LIST_QUEUE, NULL); for (c = optind + 1; c < argc; c++) libtar_list_add(l, argv[c]); return_code = par_create(tarfile, rootdir, l); libtar_list_free(l, NULL); break; case MODE_LIST: return_code = par_list(argv[optind]); break; default: break; } free(rootdir); return return_code; }