bool Parser::parseOne(Tokenizer &tokenizer, Processor &processor) { try { if (!tokenizer.hasMore()) return false; processor(block(tokenizer)); return true; } catch (const Exception &e) { THROWCS("Exception @" << tokenizer.getLocation(), e); } }
SmartPointer<Block> Parser::block(Tokenizer &tokenizer) { ParseScope scope(tokenizer.getScanner()); // Deleted bool deleted = false; if (tokenizer.consume(TokenType::DIV_TOKEN)) deleted = true; // Line number int line = -1; if (tokenizer.isID("N")) { tokenizer.advance(); Token num = tokenizer.match(TokenType::NUMBER_TOKEN); line = String::parseU32(num.getValue()); } // Children std::vector<SmartPointer<Entity> > children; // O-Code if (tokenizer.isID("O")) children.push_back(ocode(tokenizer)); while (tokenizer.hasMore()) { switch (tokenizer.getType()) { case TokenType::EOL_TOKEN: break; // End of block case TokenType::COMMENT_TOKEN: case TokenType::PAREN_COMMENT_TOKEN: children.push_back(comment(tokenizer)); break; case TokenType::POUND_TOKEN: children.push_back(assign(tokenizer)); break; default: if (!tokenizer.isType(TokenType::ID_TOKEN)) THROWS("Expected word or assignment, found " << tokenizer.getType()); children.push_back(word(tokenizer)); break; } if (tokenizer.getType() == TokenType::EOL_TOKEN) { tokenizer.advance(); break; } } return scope.set(new Block(deleted, line, children)); }