コード例 #1
0
/**
 * 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();
	}
}
コード例 #2
0
ファイル: parutil.c プロジェクト: yorickdewid/Mavicona
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;
}