コード例 #1
0
ファイル: tester.c プロジェクト: danl3v/othello
int parseTester() {
	int depth = 0;
	char *expression = malloc(256 * sizeof(char)); /* i dont think we need to malloc this */
	Value **tokens = NULL;
	Value **leftoverTokens = NULL;
	Value **parseTree = NULL;
	
	printf("> ");
	while (fgets(expression, 255, stdin)) {
		tokens = append(leftoverTokens, tokenize(expression));
		if (tokens) { printf("\nTOKENS:\n"); printTokens(*tokens); }

		parseTree = parse(tokens, &depth);

		if (depth > 0) {
			leftoverTokens = tokens;
			depth = 0;
		}
		else {
			if (parseTree) { 
				printf("\nPARSE TREE:\n"); 
				printParseTree(*parseTree); 
				printf("\n");
			}
			else { depth = 0; }
			leftoverTokens = NULL;
			printf("> ");
		}
		
	}
	free(expression);
	return 0;
}
コード例 #2
0
int main(int argc, char** argv)
{
	// details of implementation (as per the assignment requirements)
	printf("(a) Lexer implemented using TWIN BUFFER\n");
	printf("(b) FIRST set automated, hardcoded FOLLOW set taken as input from a text file\n");
	printf("(c) Both lexical and syntax analysis modules implemented\n");
	printf("(d) PARSE TABLE generated\n");
	printf("(e) STACK for syntax checking successfully implemented\n");
	printf("(f) Catches only one syntax error at a time.\n");
	printf("(g) PARSE TREE successfully generated\n");
	printf("(h) All 3 option in driver working\n");

	printf(" Press option for the defined task\n");
	printf("1 :  for  printing the token list (on the console) generated by the lexer. Each token appears in a new line alongwith the corresponding lexeme\n");
	printf("2 :  for parsing to verify the syntactic correctness of the input source code \n");
	printf("3 :  for creating the parse tree and printing it appropriately\n");
	
	int option;
	scanf("%d", &option);

	if(option == 1)
	{
		FILE *dfafp = fopen("dfa.txt", "r");
		TreeNode *dfa;
		dfa = (TreeNode *)createDFA(dfafp, dfa);
		FILE *fp = fopen(*++argv, "r");
		buffersize k = 1000;
		buffer b = createBuffer(k);
		tokenInfo info = getNextToken(fp, dfa, b, k);
		// print all tokens in the input program
		while(info.value != NULL)
		{
			printf("%s\t%s\n", info.tokenName, info.value);
			info = getNextToken(fp, dfa, b, k);
		}
	}
	else if(option == 2)
	{
		table t;
		parseTree parsetree = parseInputSourceCode(*++argv, t);	
	}
	else if(option == 3)
	{
		table t;
		parseTree parsetree = parseInputSourceCode(*++argv, t);
		printParseTree(parsetree, *++argv);
	}
	
	return 0;
}
コード例 #3
0
int printOnlyParsetree(Parser* p, Lexer lex, char* outPutTreeFile, int isParsed)
{
	if (isParsed==PARSER_NOT_INVOKED)
	{
		isParsed = parseOnlySourceCode(p, lex);
	}

	if (isParsed == PARSED_SUCCESSFULLY)
	{
		printParseTree(p->parseTree, outPutTreeFile);
		return isParsed;
	}
	else
	{
		return isParsed;
	}
}
コード例 #4
0
ファイル: parser.c プロジェクト: beepted/Compiler
ParseTree initializeParser(char *filename)
{
	//input file is the token file name
	FILE *fp;
	char ptreename[50];
	ParseTree parse_tree = (ParseTree)malloc(sizeof(struct ptree));
	//check if parsing table is already available. 
	//If yes then read it, else compute and save it.
	fp = fopen("parsingtable","r");
	if(fp==NULL)
	{
		//construct first-follow sets
		constructSTable();
		//construct predictive parsing table
		constructParsingTable();
		//save parsing table to disk file
		saveParsingTables();
	}
	else
	{
		//read parsing table from disk
		loadParsingTables(fp);
		fclose(fp);
	}
	//Open token file and read the first symbol.
	token_file = fopen(filename,"r");
	advance(token_file);
	//invoke parser. Assume starting symbol of the grammar is "Programs"
	parse_tree = parse(findSymbol("Programs"),parse_tree);
	//now print the parse tree into the file
	strcpy(ptreename,filename);
	strcat(ptreename,".ptree");
	ftree = fopen(ptreename,"w");
	printParseTree(parse_tree,0);

	/*Expected call for the symbol table*/
	//dfs_parsetree(parse_tree);
	/*Call for Symbol Table*/

	fclose(ftree);
	fclose(token_file);
	return parse_tree;
}
コード例 #5
0
ファイル: parser.c プロジェクト: beepted/Compiler
void printParseTree(ParseTree parse_tree, int level)
{
	/*Prints the Parse Tree into the file 'parse_tree'*/
	/*level: The current depth of the parse tree*/
	int i,j;
	if(parse_tree->num_branches>0)
	{
		if(level==0)
			fprintf(ftree,"%s\n",parse_tree->node->name);
		for(i=0;i<parse_tree->num_branches;i++)
		{
			for(j=0;j<level;j++)
				fprintf(ftree,"  ");
			fprintf(ftree,"|_%s",parse_tree->branches[i]->node->name);
			if((strcmp(parse_tree->branches[i]->node->name, "TK_ID")==0)||\
			(strcmp(parse_tree->branches[i]->node->name, "TK_NUM")==0))
				fprintf(ftree,":%s",parse_tree->branches[i]->node->id_or_num);
			fprintf(ftree,"\n");
			printParseTree(parse_tree->branches[i],level+1);
		}
	}
}
コード例 #6
0
ファイル: parser.c プロジェクト: danl3v/othello
void printParseTree(Node* head) {
	while (head) {
		switch (head->value->type) {
		
			case booleanType:
				if (head->value->val.boolValue) {
					printf("#t ");
				}
				else {
					printf("#f ");
				}
				break;
				
			case integerType:
				printf("%d", head->value->val.integerValue);
				break;
				
			case floatType:
				printf("%f", head->value->val.floatValue);
				break;
			
			case openType:
				printf("%s", head->value->val.openValue);
				break;
				
			case closeType:
				printf("%s", head->value->val.closeValue);
				break;
				
			case symbolType:
				printf("%s", head->value->val.symbolValue);
				break;
				
			case quoteType:
				printf("%s", head->value->val.quoteValue);
				break;
				
			case stringType:
				printf("%s", head->value->val.stringValue);
				break;
				
			case listType:
				printf("(");
				printParseTree(head->value->val.listValue->head);
				printf(")");
				break;
				
			default:
				printf("invalid type for value structure\n");
				break;
				
		}
		
		if (head->next) {
			printf(" ");
		}
		//printf("next in printParseTree\n");
		head = head->next;
	}
	
}
コード例 #7
0
ファイル: parser.c プロジェクト: david-abel/ics
void printParseTree(ConsCell* parseTree)
{
  while(parseTree != NULL && parseTree->car != NULL)
  {
    Value* currentValue = pop(&parseTree);

    switch(currentValue->type) 
    {
      case 0:
        printf("%s ", currentValue->uni.boolValue == 1 ? "#t" : "#f");
        //free(currentValue);
        break;
      case 1:
        printf("%d ",currentValue->uni.intValue);
        //free(currentValue);
        break;
      case 2:
        printf("%c ",currentValue->uni.quote);
        //free(currentValue);
        break;
      case 3:
        printf("%f ",currentValue->uni.floatValue);
        //free(currentValue);
        break;
      case 4:
        printf("%s ",currentValue->uni.symbol);
        //free(currentValue);
        break;
      case 5:
        printf("%s ",currentValue->uni.stringValue);
        //free(currentValue);
        break;
      case 6:
        printf("%c",currentValue->uni.open);
        //free(currentValue);
         break;
      case 7:
        printf("%c ",currentValue->uni.close);
        //free(currentValue);
        
        pop(&parseTree);
        printParseTree(parseTree);
        return;
      case 8:
        //printf("(");
        //printf("printing case 8");
        
        printParseTree(currentValue->uni.cons);
        //freeParseTree(currentValue);
        //printf(")");
        break;
      case 11:
        printf("Symbol: %s ", currentValue->uni.binding->symbol);
        printf("Bound type: %d ", currentValue->uni.binding->val->type);
      default:
        //printf("SYNTAX ERROR\n");
        //printf("weird default");
        break;
    }
  }
}