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; }
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; }
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; } }
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; }
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); } } }
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; } }
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; } } }