void UnwrappedLineParser::parseEnum() { bool HasContents = false; do { switch (FormatTok.Tok.getKind()) { case tok::l_brace: nextToken(); addUnwrappedLine(); ++Line.Level; parseComments(); break; case tok::l_paren: parseParens(); break; case tok::comma: nextToken(); addUnwrappedLine(); parseComments(); break; case tok::r_brace: if (HasContents) addUnwrappedLine(); --Line.Level; nextToken(); break; case tok::semi: nextToken(); addUnwrappedLine(); return; default: HasContents = true; nextToken(); break; } } while (!eof()); }
/* load XML from token stream */ Ref<XML> parseXML(Ref<Stream<int> > chars, std::string id, bool hasHeader = true, bool hasTail = false) { /* create lexer for XML file */ std::vector<std::string> symbols; symbols.push_back("<!--"); symbols.push_back("-->"); symbols.push_back("<?"); symbols.push_back("?>"); symbols.push_back("</"); symbols.push_back("/>"); symbols.push_back("<"); symbols.push_back(">"); symbols.push_back("="); Ref<Stream<Token> > cin = new TokenStream(chars,TokenStream::alpha + TokenStream::ALPHA + "_" + id, TokenStream::separators, symbols); if (hasHeader) parseHeader(cin); parseComments(cin); Ref<XML> xml = parseXML(cin); parseComments(cin); if (!hasTail) if (cin->peek() != Token::Eof()) THROW_RUNTIME_ERROR(cin->peek().Location().str()+": end of file expected"); return xml; }
/*! parse XML header */ Ref<XML> parseHeader(Ref<Stream<Token> >& cin) { Ref<XML> xml = new XML; if (cin->get() != Token::Sym("<?")) THROW_RUNTIME_ERROR(cin->unget().Location().str()+": wrong XML header"); xml->name = cin->get().Identifier(); parseComments(cin); while (cin->peek() != Token::Sym("?>")) { parseParm(cin,xml->parms); parseComments(cin); } cin->drop(); return xml; }
/*! parse XML tag */ Ref<XML> parseXML(Ref<Stream<Token> >& cin) { Ref<XML> xml = new XML; xml->loc = cin->peek().Location(); /* parse tag opening */ if (cin->get() != Token::Sym("<")) THROW_RUNTIME_ERROR(cin->unget().Location().str()+": tag expected"); xml->name = cin->get().Identifier(); parseComments(cin); while (cin->peek() != Token::Sym("/>") && cin->peek() != Token::Sym(">")) { parseParm(cin,xml->parms); parseComments(cin); } if (cin->peek() == Token::Sym("/>")) { cin->drop(); return xml; } cin->drop(); /* parse body token list */ parseComments(cin); while (cin->peek() != Token::Sym("<") && cin->peek() != Token::Sym("</")) { xml->body.push_back(cin->get()); parseComments(cin); } /* the body also contains children */ if (cin->peek() == Token::Sym("<")) { while (cin->peek() != Token::Sym("</")) { xml->children.push_back(parseXML(cin)); parseComments(cin); } } /* parse tag closing */ if (cin->get() != Token::Sym("</") ) THROW_RUNTIME_ERROR(cin->unget().Location().str()+": symbol \"</\" expected"); if (cin->get() != Token::Id(xml->name)) THROW_RUNTIME_ERROR(cin->unget().Location().str()+": closing "+xml->name+" expected"); if (cin->get() != Token::Sym(">") ) THROW_RUNTIME_ERROR(cin->unget().Location().str()+": symbol \">\" expected"); return xml; }
void UnwrappedLineParser::parseStatement() { parseComments(); switch (FormatTok.Tok.getKind()) { case tok::kw_namespace: parseNamespace(); return; case tok::kw_public: case tok::kw_protected: case tok::kw_private: parseAccessSpecifier(); return; case tok::kw_if: parseIfThenElse(); return; case tok::kw_for: case tok::kw_while: parseForOrWhileLoop(); return; case tok::kw_do: parseDoWhile(); return; case tok::kw_switch: parseSwitch(); return; case tok::kw_default: nextToken(); parseLabel(); return; case tok::kw_case: parseCaseLabel(); return; default: break; } int TokenNumber = 0; do { ++TokenNumber; switch (FormatTok.Tok.getKind()) { case tok::kw_enum: parseEnum(); return; case tok::semi: nextToken(); addUnwrappedLine(); return; case tok::l_paren: parseParens(); break; case tok::l_brace: parseBlock(); addUnwrappedLine(); return; case tok::identifier: nextToken(); if (TokenNumber == 1 && FormatTok.Tok.is(tok::colon)) { parseLabel(); return; } break; case tok::equal: nextToken(); // Skip initializers as they will be formatted by a later step. if (FormatTok.Tok.is(tok::l_brace)) nextToken(); break; default: nextToken(); break; } } while (!eof()); }