void compileArguments(ObjectNode* paramList) { // parse a list of arguments, check the consistency of the arguments and the given parameters switch (lookAhead->tokenType) { case SB_LPAR: eat(SB_LPAR); compileArgument(paramList->object); while (lookAhead->tokenType == SB_COMMA) { eat(SB_COMMA); paramList = paramList->next; if (paramList != NULL) compileArgument(paramList->object); else error(ERR_PARAMETERS_ARGUMENTS_INCONSISTENCY, currentToken->lineNo, currentToken->colNo); } // param list still has next one when we've done parsing arguments // means number of arguments doesn't match number of params if (paramList->next != NULL) error(ERR_PARAMETERS_ARGUMENTS_INCONSISTENCY, currentToken->lineNo, currentToken->colNo); eat(SB_RPAR); break; // Check FOLLOW set case SB_TIMES: case SB_SLASH: case SB_PLUS: case SB_MINUS: case KW_TO: case KW_DO: case SB_RPAR: case SB_COMMA: case SB_EQ: case SB_NEQ: case SB_LE: case SB_LT: case SB_GE: case SB_GT: case SB_RSEL: case SB_SEMICOLON: case KW_END: case KW_ELSE: case KW_THEN: // Param list exists but we don't see left parenthesis if (paramList->object != NULL) error(ERR_PARAMETERS_ARGUMENTS_INCONSISTENCY, currentToken->lineNo, currentToken->colNo); break; default: error(ERR_INVALID_ARGUMENTS, lookAhead->lineNo, lookAhead->colNo); } }
void compileArguments(ObjectNode* paramList) { //DONE: parse a list of arguments, check the consistency of the arguments and the given parameters ObjectNode* node = paramList; switch (lookAhead->tokenType) { case SB_LPAR: eat(SB_LPAR); if (node == NULL) error(ERR_PARAMETERS_ARGUMENTS_INCONSISTENCY, currentToken->lineNo, currentToken->colNo); compileArgument(node->object); node = node->next; while (lookAhead->tokenType == SB_COMMA) { eat(SB_COMMA); if (node == NULL) error(ERR_PARAMETERS_ARGUMENTS_INCONSISTENCY, currentToken->lineNo, currentToken->colNo); compileArgument(node->object); node = node->next; } if (node != NULL) error(ERR_PARAMETERS_ARGUMENTS_INCONSISTENCY, currentToken->lineNo, currentToken->colNo); eat(SB_RPAR); break; // Check FOLLOW set case SB_TIMES: case SB_SLASH: case SB_PLUS: case SB_MINUS: case KW_TO: case KW_DO: case SB_RPAR: case SB_COMMA: case SB_EQ: case SB_NEQ: case SB_LE: case SB_LT: case SB_GE: case SB_GT: case SB_RSEL: case SB_SEMICOLON: case KW_END: case KW_ELSE: case KW_THEN: break; default: error(ERR_INVALID_ARGUMENTS, lookAhead->lineNo, lookAhead->colNo); } }
void compileArguments(ObjectNode* paramList) { //TODO: parse a list of arguments, check the consistency of the arguments and the given parameters switch (lookAhead->tokenType) { case SB_LPAR: eat(SB_LPAR); compileArgument(); while (lookAhead->tokenType == SB_COMMA) { eat(SB_COMMA); compileArgument(); } eat(SB_RPAR); break; // Check FOLLOW set case SB_TIMES: case SB_SLASH: case SB_PLUS: case SB_MINUS: case KW_TO: case KW_DO: case SB_RPAR: case SB_COMMA: case SB_EQ: case SB_NEQ: case SB_LE: case SB_LT: case SB_GE: case SB_GT: case SB_RSEL: case SB_SEMICOLON: case KW_END: case KW_ELSE: case KW_THEN: break; default: error(ERR_INVALID_ARGUMENTS, lookAhead->lineNo, lookAhead->colNo); } }
void compileArguments(void) { switch (lookAhead->tokenType) { case SB_LPAR: eat(SB_LPAR); compileArgument(); while (lookAhead->tokenType == SB_COMMA) { eat(SB_COMMA); compileArgument(); } eat(SB_RPAR); break; // Check FOLLOW set case SB_TIMES: case SB_SLASH: case SB_PLUS: case SB_MINUS: case KW_TO: case KW_DO: case SB_RPAR: case SB_COMMA: case SB_EQ: case SB_NEQ: case SB_LE: case SB_LT: case SB_GE: case SB_GT: case SB_RSEL: case SB_SEMICOLON: case KW_END: case KW_ELSE: case KW_THEN: break; default: error(ERR_INVALID_ARGUMENTS, lookAhead->lineNo, lookAhead->colNo); } }