コード例 #1
0
void Visualize() {
	printf("\nGenerating visualization for %s...", kDBName);
	Stopwatch();

	//printf("\nPreparing tree");
	PrepareTree(&GameTree);

	//printf("\nPreparing file");
	PrepareDOTFile();

	//printf("\nFilling tree");
	PopulateEdgelist(&GameTree);

	//printf("\nWriting file");
	Write(DOTFile, &GameTree);

	//printf("\nClosing file");
	CloseDOTFile(DOTFile);

	//printf("\nCleaning up tree");
	CleanupTree(&GameTree);

	printf("done in %u seconds!", Stopwatch());
	printf("\nVisualization saved to directory \"visualization\\m%s\"", kDBName);
	printf("\nPlease use Graphviz's 'dot' tool to render the DOT files as images.\n");
	return;
}
コード例 #2
0
ファイル: Script.cpp プロジェクト: ZmeyNet/lcdmiscellany
int Compile(unsigned char* string, int len, unsigned char *fileName, wchar_t *fileNameW) {
	Token *tokens;
	int numTokens;
	int numErrors = Tokenize(string, len, tokens, numTokens, fileNameW);
	if (numErrors) {
		CleanupTokens(tokens, numTokens);
		return 0;
	}
/*	Token test[100];
	test[0].type = ONE;
	test[1].type = PLUS;
	test[2].type = ONE;
	test[3].type = DOLLAR;
//	TreeNode *t = ParseScript(test, 4);
//*/
	ParseTree *tree = ParseScript(tokens, numTokens);
	if (!tree) {
		return 0;
	}
	TempCode * tempCode = GenTempCode(tree);
	CleanupTree(tree);
	if (!tempCode) {
		return 0;
	}
	if (!GenCode(tempCode, string, len, fileName)) {
		return 0;
	}
	return 1;
}
コード例 #3
0
ファイル: Parser.cpp プロジェクト: ZmeyNet/lcdmiscellany
void CleanupTree(ParseTree *t) {
	if (t->val) free(t->val);
	for (int i=0; i<t->numChildren; i++) {
		if (t->children[i])
			CleanupTree(t->children[i]);
	}
	free(t);
}
コード例 #4
0
void CEquipmentLocationDialog::OnOK()
{
    TBTreeStateMgr::SaveTreeState(_T("EquipmentLocation"),&m_ctlEquipmentTree);

    CleanupTree();

    m_ctlCarsList.SaveState("State","EquipmentLoocationDialog_m_ctlCarsList");

    CDialog::OnOK();
}
コード例 #5
0
ファイル: Parser.cpp プロジェクト: ZmeyNet/lcdmiscellany
ParseTree * ParseScript(Token *tokens, int numTokens) {
	int i;
	if (numTokens == 1) {
		CleanupTokens(tokens, numTokens);
		return 0;
	}
	if (!actionTable) {
		int numSets = 0;
		ItemSet **set = (ItemSet**) malloc(sizeof(ItemSet*)*1000);
		ItemSet **newSets = (ItemSet**) malloc(sizeof(ItemSet*)*1000);
		if (!set || !newSets) {
			free(set);
			free(newSets);
			return 0;
		}
		int changed = 1;
		int *followSets = (int*) calloc(1, PARSER_NONE * sizeof(int) * PARSER_NONE);
		int *firstSets = (int*) calloc(1, PARSER_NONE * sizeof(int) * PARSER_NONE);
		for (i=0; i<PARSER_SCRIPT; i++) {
			firstSets[PARSER_NONE*i+i] = 1;
		}
		while (changed) {
			changed = 0;
			for (int r = 0; r<NUM_RULES; r++) {
				int R = rules[r].result;
				int F = rules[r].terms[0];
				for (i=0; i<PARSER_NONE;i++) {
					if (firstSets[F*PARSER_NONE+i] && !firstSets[R*PARSER_NONE+i]) {
						firstSets[R*PARSER_NONE+i] = 1;
						changed = 1;
					}
				}
			}
		}
		changed = 1;
		while (changed) {
			changed = 0;
			for (int r = 0; r<NUM_RULES; r++) {
				for (int p=0; p<rules[r].numTerms-1; p++) {
					ScriptTokenType F = rules[r].terms[p];
					ScriptTokenType S = rules[r].terms[p+1];
					for (i=0; i<PARSER_NONE;i++) {
						if (firstSets[S*PARSER_NONE+i] && !followSets[F*PARSER_NONE+i]) {
							followSets[F*PARSER_NONE+i] = 1;
							changed = 1;
						}
					}
				}
				ScriptTokenType F = rules[r].terms[rules[r].numTerms-1];
				ScriptTokenType S = rules[r].result;
				for (i=0; i<PARSER_NONE;i++) {
					if (followSets[S*PARSER_NONE+i] && !followSets[F*PARSER_NONE+i]) {
						followSets[F*PARSER_NONE+i] = 1;
						changed = 1;
					}
				}
			}
		}

		set[numSets++] = (ItemSet *) malloc(sizeof(ItemSet));
		set[0]->numItems = 1;
		set[0]->items[0].position = 0;
		set[0]->items[0].rule = 0;
		int closureId = 0;
		int closureNotes[sizeof(rules) / sizeof(Rule)];
		for (i=0; i<sizeof(closureNotes)/sizeof(int);i++)
			closureNotes[i] = -1;
		//memset(closureNotes, -1, sizeof(closureNotes));
		CalcClosure(&set[0], closureNotes, closureId++);

		for (i=0; i<numSets; i++) {
			int numNewSets = 0;
			int j;
			for (j=0; j<set[i]->numItems; j++) {
				set[i]->items[j].transition = -1;
				if (set[i]->items[j].position != rules[set[i]->items[j].rule].numTerms) {
					int q;
					for (q=0; q<numNewSets; q++) {
						if (rules[set[i]->items[j].rule].terms[set[i]->items[j].position] == rules[newSets[q]->items[0].rule].terms[newSets[q]->items[0].position-1]) {
							srealloc(newSets[q] , sizeof(ItemSet) + sizeof(Item) * newSets[q]->numItems);
							break;
						}
					}
					if (q==numNewSets) {
						newSets[q] = (ItemSet*) malloc(sizeof(ItemSet));
						newSets[q]->numItems = 0;
						numNewSets++;
					}
					newSets[q]->items[newSets[q]->numItems].position = set[i]->items[j].position+1;
					newSets[q]->items[newSets[q]->numItems].rule = set[i]->items[j].rule;
					newSets[q]->items[newSets[q]->numItems].transition = j;
					newSets[q]->numItems++;
				}
			}
			for (j=0; j<numNewSets; j++) {
				CalcClosure(&newSets[j], closureNotes, closureId++);
				int q = 0;
				for (q = 0; q<numSets; q++) {
					int match = 0;
					if (set[q]->numItems == newSets[j]->numItems)
					while (match < newSets[j]->numItems) {
						int f;
						for (f = 0; f<set[q]->numItems; f++) {
							if (set[q]->items[f].rule == newSets[j]->items[match].rule &&
								set[q]->items[f].position == newSets[j]->items[match].position)
								break;
						}
						if (f == set[q]->numItems) break;
						match++;
					}
					if (match == newSets[j]->numItems) break;
				}
				for (int w=0; w<newSets[j]->numItems; w++)
					if (newSets[j]->items[w].transition >= 0)
						set[i]->items[newSets[j]->items[w].transition].transition = q;
				if (q<numSets) {
					free(newSets[j]);
				}
				else {
					set[numSets++] = newSets[j];
				}
			}
		}
		free(newSets);

		actionTable = (int*) malloc(sizeof(int) * numSets*PARSER_NONE);
		for (i=numSets*PARSER_NONE-1; i>=0;i--) {
			actionTable[i] = -1;
		}

		for (i=0; i<numSets; i++) {
			int reduce = 0;
			for (int w=0; w<set[i]->numItems; w++) {
				if (set[i]->items[w].position < rules[set[i]->items[w].rule].numTerms) {
					int term = rules[set[i]->items[w].rule].terms[set[i]->items[w].position];
					if (actionTable[i*PARSER_NONE+term]>=0&& (actionTable[i*PARSER_NONE+term]&0xFFFFFF)-set[i]->items[w].transition !=0) {
						i=i;
					}
					actionTable[i*PARSER_NONE+term] = set[i]->items[w].transition;
					if (term < PARSER_SCRIPT) {
						if (term != TOKEN_END)
							actionTable[i*PARSER_NONE+term] |= SHIFT;
						else
							actionTable[i*PARSER_NONE+term] = ACCEPT;
					}
					/*
					if (rules[set[i]->items[w].rule].terms[set[i]->items[w].position] < S) {
						actionTable[i*PARSER_NONE+set[i]->items[w].rule] = set[i]->items[w].transition;
						else 
							actionTable[i*PARSER_NONE+set[i]->items[w].rule] |= SHIFT;
					}//*/
				}
				else {
					/*if (reduce && reduce != set[i]->items[w].rule) {
						reduce = reduce;
					}
					reduce = set[i]->items[w].rule;
					//*/
					reduce = set[i]->items[w].rule;
					for (int x = 0; x<PARSER_SCRIPT; x++) {
						if (followSets[rules[reduce].result*PARSER_NONE+x]) {
							if (actionTable[x+i*PARSER_NONE] == -1) {
								actionTable[x+i*PARSER_NONE] = REDUCE | reduce;
							}
							else {
								i=i;
							}
						}
					}
				}
			}
			/*if (reduce) {
				for (int w = 0; w<PARSER_SCRIPT; w++) {
					if (actionTable[w+i*PARSER_NONE] == -1) {
						actionTable[w+i*PARSER_NONE] = REDUCE | reduce;
					}
				}
			}*/
		}
		free(followSets);
		free(firstSets);
		for (i=0; i<numSets; i++) {
			free(set[i]);
		}
		free(set);
	}

	int maxStackSize = 1000;
	int *stack = (int*) malloc(sizeof(int) * 1000);
	//int output[1000];
	stack[0] = 0;
	//int outputLen = 0;
	int stackSize = 1;
	int pos = 0;
	int accept = 0;
	int ParseTrees = 0;

	int maxParseTrees = 1000;
	ParseTree **tree = (ParseTree**) malloc(sizeof(ParseTree*) * 1000);
	int error = 0;
	while (pos < numTokens && stackSize > 0) {
		int row = stack[stackSize-1];
		ScriptTokenType token = tokens[pos].type;
		int i = actionTable[token+row*PARSER_NONE];
		if (i==-1) {
			if (pos && !tokens[pos].line) {
				ParseError(tokens+pos-1);
			}
			else {
				ParseError(tokens+pos);
			}
			error = 1;
			break;
		}
		else if ((i&ACTION_MASK) == SHIFT) {
			i &= ~SHIFT;
			if (stackSize == maxStackSize) {
				if (!srealloc(stack, sizeof(int) * (maxStackSize*=2))) {
					ParseError(tokens+pos);
					error = 1;
					break;
				}
			}
			if (ParseTrees == maxParseTrees) {
				if (!srealloc(tree, sizeof(ParseTree*) * (maxParseTrees*=2))) {
					ParseError(tokens+pos);
					error = 1;
					break;
				}
			}
			stack[stackSize++] = i;
			tree[ParseTrees] = (ParseTree*) calloc(1, sizeof(ParseTree));
			if (!tree[ParseTrees]) {
				ParseError(tokens+pos);
				error = 1;
				break;
			}
			{
				tree[ParseTrees]->line = tokens[pos].line;
				tree[ParseTrees]->pos = tokens[pos].pos;
				tree[ParseTrees]->start = tokens[pos].start;
			}
			// Temporary node.  Will be eaten by another.
			tree[ParseTrees]->type = NODE_LEAF;
			tree[ParseTrees]->numChildren = 0;
			tree[ParseTrees]->intVal = tokens[pos].intVal;
			tree[ParseTrees++]->val = tokens[pos].val;
			tokens[pos].val = 0;

			pos++;
		}
		else if ((i&ACTION_MASK) == REDUCE) {
			i &= ~REDUCE;
			// output[outputLen++] = i;
			ParseTree *children[5] = {0,0,0,0,0};
			int numChildren = 0;
			int nline;
			unsigned char *npos;
			unsigned char *nstart;
			for (int j = 0; j<rules[i].numTerms; j++) {
				if (j == rules[i].operatorPos) {
					nline = tree[ParseTrees - rules[i].numTerms+j]->line;
					npos = tree[ParseTrees - rules[i].numTerms+j]->pos;
					nstart = tree[ParseTrees - rules[i].numTerms+j]->start;
				}
				if (rules[i].terms[j] <= TOKEN_IDENTIFIER || rules[i].terms[j]>=TOKEN_END) {
					children[numChildren++] = tree[ParseTrees - rules[i].numTerms+j];
				}
				else {
					free(tree[ParseTrees - rules[i].numTerms+j]);
					tree[ParseTrees - rules[i].numTerms+j] = 0;
				}
			}
			ParseTrees -= rules[i].numTerms;
			if (rules[i].nodeType == NODE_NONE) {
				tree[ParseTrees] = children[0];
			}
			else {
				if (numChildren && children[0]->type == NODE_LEAF) {
					tree[ParseTrees] = children[0];
				}
				else {
					tree[ParseTrees] = (ParseTree*) calloc(1, sizeof(ParseTree));
					if (!tree[ParseTrees]) {
						ParseError(tokens+pos);
						error = 1;
						break;
					}
					tree[ParseTrees]->children[0] = children[0];
				}
				tree[ParseTrees]->numChildren = numChildren;
				tree[ParseTrees]->children[1] = children[1];
				tree[ParseTrees]->children[2] = children[2];
				tree[ParseTrees]->children[3] = children[3];
				tree[ParseTrees]->children[4] = children[4];
				tree[ParseTrees]->type = rules[i].nodeType;
			}
			tree[ParseTrees]->line = nline;
			tree[ParseTrees]->pos = npos;
			tree[ParseTrees]->start = nstart;
			ParseTrees++;
			stackSize -= rules[i].numTerms;
			if (stackSize <= 0) {
				ParseError(tokens+pos);
				error = 1;
				break;
			}
			else {
				int w = rules[i].result;
				int t = actionTable[stack[stackSize-1]*PARSER_NONE + w];
				if (t >= 0 && t < 0x1000000) {
					stack[stackSize++] = t;
				}
				else {
					ParseError(tokens+pos);
					error = 1;
					break;
				}
			}
		}
		else if (i == ACCEPT) {
			accept = 1;
			break;
		}
		else {
			ParseError(tokens+pos);
			error = 1;
			break;
		}
	}


	free(stack);
	CleanupTokens(tokens, numTokens);
	if (error) {
		for (int i=0; i<ParseTrees; i++) {
			CleanupTree(tree[i]);
		}
		free(tree);
		return 0;
	}
	ParseTree *out = tree[0];
	free(tree);
	return out;
}
コード例 #6
0
/*
 * Process Response files on the command line
 * Returns true if it allocated a new argv array that must be freed later
 */
void ConsoleArgs::ProcessResponseArgs()
{
    HRESULT hr;
    b_tree *response_files = NULL;

    WCHAR   szFilename[MAX_PATH];
    WCAllocBuffer textBuffer;

    for (WStrList * listCurArg = m_listArgs;
        listCurArg != NULL && !m_output->HadFatalError();
        listCurArg = listCurArg->next)
    {
        WCHAR  * szArg = listCurArg->arg;

        // Skip everything except Response files
        if (szArg == NULL || szArg[0] != '@')
            continue;

        if (wcslen(szArg) == 1) {
            m_output->ShowErrorIdString( ERR_NoFileSpec, ERROR_ERROR, szArg);
            goto CONTINUE;
        }

        // Check for duplicates
        if (!GetFullFileName( RemoveQuotes(WCBuffer::CreateFrom(&szArg[1])), szFilename, false))
            continue;

        hr = TreeAdd(&response_files, szFilename);
        if (hr == E_OUTOFMEMORY) {
            m_output->ShowErrorId(FTL_NoMemory, ERROR_FATAL);
            goto CONTINUE;
        } else if (hr == S_FALSE) {
            m_output->ShowErrorIdString(ERR_DuplicateResponseFile, ERROR_ERROR, szFilename);
            goto CONTINUE;
        }

        FileType fileType;
        textBuffer.Clear();
        if (FAILED(hr = ReadTextFile(szFilename, NULL, textBuffer, &fileType)) || hr == S_FALSE)
        {
            if (hr == E_OUTOFMEMORY) {
                m_output->ShowErrorId(FTL_NoMemory, ERROR_FATAL);
            } else if (FAILED(hr)) {
                if (fileType == ftBinary)
                    m_output->ShowErrorIdString(ERR_BinaryFile, ERROR_ERROR, szFilename);
                else
                    m_output->ShowErrorIdString(ERR_OpenResponseFile, ERROR_ERROR, szFilename, m_output->ErrorHR(hr));
            }
            goto CONTINUE;
        }


        TextToArgs( textBuffer, &listCurArg->next);

CONTINUE: // remove the response file argument, and continue to the next.
        listCurArg->arg = NULL;
        VSFree(szArg);
    }

    CleanupTree(response_files);
}