static bool parseList(ParseTreeNode* parentNode) { // Store current state for rolling back if we fail int curToken = said_token; int curTreePos = said_tree_pos; ParseTreeNode* curRightChild = parentNode->right; bool found; ParseTreeNode* newParent = parentNode; found = parseListEntry(newParent); if (found) { newParent = newParent->right; found = parseComma(newParent); return true; } // Rollback said_token = curToken; said_tree_pos = curTreePos; parentNode->right = curRightChild; return false; }
void Parser::parse(list<Token> tokens) { for (list<Token>::iterator it=tokens.begin(); it != tokens.end(); it++) { token = *it; TokenType type = token.getType(); if (comment && type != LINE_END) continue; switch(type) { case SEMICOLON: parseSemicolon(); break; case LINE_START: parseLineStart(); break; case LINE_END: parseLineEnd(); break; case COLON: parseColon(); break; case WHITESPACE: parseWhitespace(); break; case COMMA: parseComma(); break; case TEXT: parseText(); break; } } }