/*** Parse a statement ***/ Node* Parser::parseStatement() { if(hasTokens(2) && peekToken().getType() == T_IDENTIFIER && peekToken(2).getType() == T_ASSIGN) return parseAssign(); if(hasTokens(2) && peekToken().getType() == T_IDENTIFIER && peekToken(2).getType() == T_LPAREN) return parseCall(); if(hasTokens() && peekToken().getType() == T_CALL) return parseCall(); if(hasTokens() && peekToken().getType() == T_CASE) return parseCase(); if(hasTokens() && peekToken().getType() == T_DO) return parseDo(); if(hasTokens() && peekToken().getType() == T_END) return parseEnd(); if(hasTokens() && peekToken().getType() == T_EXIT) return parseExit(); if(hasTokens() && peekToken().getType() == T_FOR) return parseFor(); if(hasTokens() && peekToken().getType() == T_IF) return parseIf(); if(hasTokens() && peekToken().getType() == T_INPUT) return parseInput(); if(hasTokens() && peekToken().getType() == T_OUTPUT) return parseOutput(); if(hasTokens() && peekToken().getType() == T_REPEAT) return parseRepeat(); if(hasTokens() && peekToken().getType() == T_RETURN) return parseReturn(); if(hasTokens(2) && peekToken(1).getType() == T_IDENTIFIER && peekToken(2).getType() == T_LBRACKET) return parseSliceSelectAssign(); if(hasTokens() && peekToken().getType() == T_WHILE) return parseWhile(); throw ParserSyntaxException(getToken(), "Invalid statement!"); return 0; }
static BoardInfo* parseBoardInfo(uint8_t* data) { if(data[offset] == 0xc0) { offset++; return NULL; } int len = parseArraySize(data); BoardInfo* ret = malloc(sizeof(BoardInfo)); for(int i = 0; i < len; i++) { if(i == 0) { ret->exit = parseExit(data); } else if(i == 1) { ret->transfer = parseTransfer(data, &(ret->transferLen)); } } return ret; }
static Transfer* parseTransfer(uint8_t *data, int *transferLen) { if(data[offset] == 0xc0) { offset++; return NULL; } int len = parseArraySize(data); Transfer* ret = malloc(sizeof(Transfer) * len); *transferLen = len; for(int i = 0; i < len; i++) { int len2 = parseArraySize(data); for(int j = 0; j < len2; j++) { if (j == 0) { ret[i].prevStation = parseInt(data); } else if (j == 1) { ret[i].toStation = parseInt(data); } else if (j == 2) { ret[i].nextStation = parseInt(data); } else if (j == 3) { ret[i].pos = parseExit(data); } } } return ret; }