Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
332 changes: 221 additions & 111 deletions parser.c
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ int* getFirsts(char * input){
ssize_t read;


int firsts[25];
int *firsts = malloc(25*sizeof(int*));

FILE *fp = fopen("firsts.txt", "r");
if (fp == NULL){
Expand Down Expand Up @@ -64,7 +64,7 @@ int* getFirsts(char * input){

// returns firsts set of given set of tokens
int* first(char * input){
int firsts[1000];
int *firsts = malloc(100 * sizeof(int*));
int* current;
int count = 0;
char * token;
Expand Down Expand Up @@ -111,7 +111,7 @@ int* getFollows(char * input){
int count = 0;
ssize_t read;

int follows[25];
int * follows = malloc(sizeof(int*)*25);

FILE *fp = fopen("follows.txt", "r");
if (fp == NULL){
Expand Down Expand Up @@ -235,125 +235,235 @@ int getRowIndex(char* s)

// returns token name for given id
char* getCorrespondingToken(int f){
char * token = malloc(100);
switch(f){
case 1: return "TK_ASSIGNOP";
case 2: return "TK_COMMENT";
case 3: return "TK_FIELDID";
case 4: return "TK_ID";
case 5: return "TK_NUM";
case 6: return "TK_RNUM";
case 7: return "TK_FUNID";
case 8: return "TK_RECORDID";
case 9: return "TK_WITH";
case 10: return "TK_PARAMETERS";
case 11: return "TK_END";
case 12: return "TK_WHILE";
case 13: return "TK_INT";
case 14: return "TK_REAL";
case 15: return "TK_TYPE";
case 16: return "TK_MAIN";
case 17: return "TK_GLOBAL";
case 18: return "TK_PARAMETER";
case 19: return "TK_LIST";
case 20: return "TK_SQL";
case 21: return "TK_SQR";
case 22: return "TK_INPUT";
case 23: return "TK_OUTPUT";
case 24: return "TK_INT";
case 25: return "TK_REAL";
case 26: return "TK_SEM";
case 27: return "TK_COLON";
case 28: return "TK_DOT";
case 29: return "TK_ENDWHILE";
case 30: return "TK_OP";
case 31: return "TK_CL";
case 32: return "TK_IF";
case 33: return "TK_THEN";
case 34: return "TK_ENDIF";
case 35: return "TK_READ";
case 36: return "TK_WRITE";
case 37: return "TK_RETURN";
case 38: return "TK_PLUS";
case 39: return "TK_MINUS";
case 40: return "TK_MUL";
case 41: return "TK_DIV";
case 42: return "TK_CALL";
case 43: return "TK_RECORD";
case 44: return "TK_ENDRECORD";
case 45: return "TK_ELSE";
case 46: return "TK_AND";
case 47: return "TK_OR";
case 48: return "TK_NOT";
case 49: return "TK_LT";
case 50: return "TK_LE";
case 51: return "TK_EQ";
case 52: return "TK_GT";
case 53: return "TK_GE";
case 54: return "TK_NE";
case 55: return "$";
case 56: return "TK_COMMA";
case 57: return "eps";
case 1: strcpy(token, "TK_ASSIGNOP");
break;
case 2: strcpy(token, "TK_COMMENT");
break;
case 3: strcpy(token, "TK_FIELDID");
break;
case 4: strcpy(token, "TK_ID");
break;
case 5: strcpy(token, "TK_NUM");
break;
case 6: strcpy(token, "TK_RNUM");
break;
case 7: strcpy(token, "TK_FUNID");
break;
case 8: strcpy(token, "TK_RECORDID");
break;
case 9: strcpy(token, "TK_WITH");
break;
case 10: strcpy(token, "TK_PARAMETERS");
break;
case 11: strcpy(token, "TK_END");
break;
case 12: strcpy(token, "TK_WHILE");
break;
case 13: strcpy(token, "TK_INT");
break;
case 14: strcpy(token, "TK_REAL");
break;
case 15: strcpy(token, "TK_TYPE");
break;
case 16: strcpy(token, "TK_MAIN");
break;
case 17: strcpy(token, "TK_GLOBAL");
break;
case 18: strcpy(token, "TK_PARAMETER");
break;
case 19: strcpy(token, "TK_LIST");
break;
case 20: strcpy(token, "TK_SQL");
break;
case 21: strcpy(token, "TK_SQR");
break;
case 22: strcpy(token, "TK_INPUT");
break;
case 23: strcpy(token, "TK_OUTPUT");
break;
case 24: strcpy(token, "TK_INT");
break;
case 25: strcpy(token, "TK_REAL");
break;
case 26: strcpy(token, "TK_SEM");
break;
case 27: strcpy(token, "TK_COLON");
break;
case 28: strcpy(token, "TK_DOT");
break;
case 29: strcpy(token, "TK_ENDWHILE");
break;
case 30: strcpy(token, "TK_OP");
break;
case 31: strcpy(token, "TK_CL");
break;
case 32: strcpy(token, "TK_IF");
break;
case 33: strcpy(token, "TK_THEN");
break;
case 34: strcpy(token, "TK_ENDIF");
break;
case 35: strcpy(token, "TK_READ");
break;
case 36: strcpy(token, "TK_WRITE");
break;
case 37: strcpy(token, "TK_RETURN");
break;
case 38: strcpy(token, "TK_PLUS");
break;
case 39: strcpy(token, "TK_MINUS");
break;
case 40: strcpy(token, "TK_MUL");
break;
case 41: strcpy(token, "TK_DIV");
break;
case 42: strcpy(token, "TK_CALL");
break;
case 43: strcpy(token, "TK_RECORD");
break;
case 44: strcpy(token, "TK_ENDRECORD");
break;
case 45: strcpy(token, "TK_ELSE");
break;
case 46: strcpy(token, "TK_AND");
break;
case 47: strcpy(token, "TK_OR");
break;
case 48: strcpy(token, "TK_NOT");
break;
case 49: strcpy(token, "TK_LT");
break;
case 50: strcpy(token, "TK_LE");
break;
case 51: strcpy(token, "TK_EQ");
break;
case 52: strcpy(token, "TK_GT");
break;
case 53: strcpy(token, "TK_GE");
break;
case 54: strcpy(token, "TK_NE");
break;
case 55: strcpy(token, "$");
break;
case 56: strcpy(token, "TK_COMMA");
break;
case 57: strcpy(token, "eps");
break;

// non-terminals below!

case 100: return "program";
case 101: return "mainFunction";
case 102: return "otherFunctions";
case 103: return "function";
case 104: return "input_par";
case 105: return "output_par";
case 106: return "parameter_list";
case 107: return "dataType";
case 108: return "primitiveDatatype";
case 109: return "constructedDatatype";
case 110: return "remaining_list";
case 111: return "stmts";
case 112: return "typeDefinitions";
case 113: return "typeDefinition";
case 114: return "fieldDefinitions";
case 115: return "fieldDefinition";
case 116: return "moreFields";
case 117: return "declarations";
case 118: return "declaration";
case 119: return "global_or_not";
case 120: return "otherStmts";
case 121: return "stmt";
case 122: return "assignmentStmt";
case 123: return "singleOrRecId";
case 124: return "funCallStmt";
case 125: return "outputParameters";
case 126: return "inputParameters";
case 127: return "iterativeStmt";
case 128: return "conditionalStmt";
case 129: return "elsePart";
case 130: return "ioStmt";
case 131: return "allVar";
case 132: return "arithmeticExpression";
case 133: return "expPrime";
case 134: return "term";
case 135: return "termPrime";
case 136: return "factor";
case 137: return "highPrecedenceOperators";
case 138: return "lowPrecedenceOperators";
case 139: return "all";
case 140: return "temp";
case 141: return "booleanExpression";
case 142: return "var";
case 143: return "logicalOp";
case 144: return "relationalOp";
case 145: return "returnStmt";
case 146: return "optionalReturn";
case 147: return "idList";
case 148: return "more_ids";
case 149: return "new24";
case 150: return "newVar";
case 100: strcpy(token, "program");
break;
case 101: strcpy(token, "mainFunction");
break;
case 102: strcpy(token, "otherFunctions");
break;
case 103: strcpy(token, "function");
break;
case 104: strcpy(token, "input_par");
break;
case 105: strcpy(token, "output_par");
break;
case 106: strcpy(token, "parameter_list");
break;
case 107: strcpy(token, "dataType");
break;
case 108: strcpy(token, "primitiveDatatype");
break;
case 109: strcpy(token, "constructedDatatype");
break;
case 110: strcpy(token, "remaining_list");
break;
case 111: strcpy(token, "stmts");
break;
case 112: strcpy(token, "typeDefinitions");
break;
case 113: strcpy(token, "typeDefinition");
break;
case 114: strcpy(token, "fieldDefinitions");
break;
case 115: strcpy(token, "fieldDefinition");
break;
case 116: strcpy(token, "moreFields");
break;
case 117: strcpy(token, "declarations");
break;
case 118: strcpy(token, "declaration");
break;
case 119: strcpy(token, "global_or_not");
break;
case 120: strcpy(token, "otherStmts");
break;
case 121: strcpy(token, "stmt");
break;
case 122: strcpy(token, "assignmentStmt");
break;
case 123: strcpy(token, "singleOrRecId");
break;
case 124: strcpy(token, "funCallStmt");
break;
case 125: strcpy(token, "outputParameters");
break;
case 126: strcpy(token, "inputParameters");
break;
case 127: strcpy(token, "iterativeStmt");
break;
case 128: strcpy(token, "conditionalStmt");
break;
case 129: strcpy(token, "elsePart");
break;
case 130: strcpy(token, "ioStmt");
break;
case 131: strcpy(token, "allVar");
break;
case 132: strcpy(token, "arithmeticExpression");
break;
case 133: strcpy(token, "expPrime");
break;
case 134: strcpy(token, "term");
break;
case 135: strcpy(token, "termPrime");
break;
case 136: strcpy(token, "factor");
break;
case 137: strcpy(token, "highPrecedenceOperators");
break;
case 138: strcpy(token, "lowPrecedenceOperators");
break;
case 139: strcpy(token, "all");
break;
case 140: strcpy(token, "temp");
break;
case 141: strcpy(token, "booleanExpression");
break;
case 142: strcpy(token, "var");
break;
case 143: strcpy(token, "logicalOp");
break;
case 144: strcpy(token, "relationalOp");
break;
case 145: strcpy(token, "returnStmt");
break;
case 146: strcpy(token, "optionalReturn");
break;
case 147: strcpy(token, "idList");
break;
case 148: strcpy(token, "more_ids");
break;
case 149: strcpy(token, "new24");
break;
case 150: strcpy(token, "newVar");
break;
default:
{
char buf[12];
sprintf(buf, "Nothing", f);
return buf;
}
}
return token;
}
// returns token id for terminals
int getColumnIndex(char* s)
Expand Down
2 changes: 2 additions & 0 deletions parser.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,8 @@ void intializeTable(table T);

int printParseTree_r(parseTree curr, FILE* f, int * size, int print);

char* getCorrespondingToken(int f);

int error_in_parsing;

#endif