📄 qxmlstream.g
字号:
bool scanUntil(const char *str, short tokenToInject = -1); bool scanString(const char *str, short tokenToInject, bool requireSpace = true); inline void injectToken(ushort tokenToInject) { putChar(int(tokenToInject) << 16); } static bool validateName(const QStringRef &name); void parseEntity(const QString &value); QXmlStreamReaderPrivate *entityParser; bool scanAfterLangleBang(); bool scanPublicOrSystem(); bool scanNData(); bool scanAfterDefaultDecl(); bool scanAttType(); // scan optimization functions. Not strictly necessary but LALR is // not very well suited for scanning fast int fastScanLiteralContent(); int fastScanSpace(); int fastScanContentCharList(); int fastScanName(int *prefix = 0); inline int fastScanNMTOKEN(); bool parse(); inline void consumeRule(int); void raiseError(QXmlStreamReader::Error error, const QString& message = QString()); void raiseWellFormedError(const QString &message);private: /*! \internal Never assign to variable type directly. Instead use this function. This prevents errors from being ignored. */ inline void setType(const QXmlStreamReader::TokenType t) { if(type != QXmlStreamReader::Invalid) type = t; }};bool QXmlStreamReaderPrivate::parse(){ // cleanup currently reported token switch (type) { case QXmlStreamReader::StartElement: name.clear(); prefix.clear(); qualifiedName.clear(); namespaceUri.clear(); if (publicNamespaceDeclarations.size()) publicNamespaceDeclarations.clear(); if (attributes.size()) attributes.resize(0); if (isEmptyElement) { setType(QXmlStreamReader::EndElement); Tag &tag = tagStack_pop(); namespaceUri = tag.namespaceDeclaration.namespaceUri; name = tag.name; qualifiedName = tag.qualifiedName; isEmptyElement = false; return true; } clearTextBuffer(); break; case QXmlStreamReader::EndElement: name.clear(); prefix.clear(); qualifiedName.clear(); namespaceUri.clear(); clearTextBuffer(); break; case QXmlStreamReader::DTD: publicNotationDeclarations.clear(); publicEntityDeclarations.clear(); // fall through case QXmlStreamReader::Comment: case QXmlStreamReader::Characters: isCDATA = isWhitespace = false; text.clear(); clearTextBuffer(); break; case QXmlStreamReader::EntityReference: text.clear(); name.clear(); clearTextBuffer(); break; case QXmlStreamReader::ProcessingInstruction: processingInstructionTarget.clear(); processingInstructionData.clear(); clearTextBuffer(); break; case QXmlStreamReader::NoToken: case QXmlStreamReader::Invalid: break; case QXmlStreamReader::StartDocument: lockEncoding = true;#ifndef QT_NO_TEXTCODEC if(decoder->hasFailure()) { raiseWellFormedError(QXmlStream::tr("Encountered incorrectly encoded content.")); readBuffer.clear(); return false; }#endif // fall through default: clearTextBuffer(); ; } setType(QXmlStreamReader::NoToken); // the main parse loop int act, r; if (resumeReduction) { act = state_stack[tos-1]; r = resumeReduction; resumeReduction = 0; goto ResumeReduction; } act = state_stack[tos]; forever { if (token == -1 && - TERMINAL_COUNT != action_index[act]) { uint cu = getChar(); token = NOTOKEN; token_char = cu; if (cu & 0xff0000) { token = cu >> 16; } else switch (token_char) { case 0xfffe: case 0xffff: token = ERROR; break; case '\r': token = SPACE; if (cu == '\r') { if ((token_char = filterCarriageReturn())) { ++lineNumber; lastLineStart = characterOffset + readBufferPos; break; } } else { break; } // fall through case '\0': { token = EOF_SYMBOL; if (!tagsDone && !inParseEntity) { int a = t_action(act, token); if (a < 0) { raiseError(QXmlStreamReader::PrematureEndOfDocumentError); return false; } } } break; case '\n': ++lineNumber; lastLineStart = characterOffset + readBufferPos; case ' ': case '\t': token = SPACE; break; case '&': token = AMPERSAND; break; case '#': token = HASH; break; case '\'': token = QUOTE; break; case '\"': token = DBLQUOTE; break; case '<': token = LANGLE; break; case '>': token = RANGLE; break; case '[': token = LBRACK; break; case ']': token = RBRACK; break; case '(': token = LPAREN; break; case ')': token = RPAREN; break; case '|': token = PIPE; break; case '=': token = EQ; break; case '%': token = PERCENT; break; case '/': token = SLASH; break; case ':': token = COLON; break; case ';': token = SEMICOLON; break; case ',': token = COMMA; break; case '-': token = DASH; break; case '+': token = PLUS; break; case '*': token = STAR; break; case '.': token = DOT; break; case '?': token = QUESTIONMARK; break; case '!': token = BANG; break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': token = DIGIT; break; default: if (cu < 0x20) token = NOTOKEN; else token = LETTER; break; } } act = t_action (act, token); if (act == ACCEPT_STATE) { // reset the parser in case someone resumes (process instructions can follow a valid document) tos = 0; state_stack[tos++] = 0; state_stack[tos] = 0; return true; } else if (act > 0) { if (++tos == stack_size) reallocateStack(); Value &val = sym_stack[tos]; val.c = token_char; val.pos = textBuffer.size(); val.prefix = 0; val.len = 1; if (token_char) textBuffer.inline_append(token_char); state_stack[tos] = act; token = -1; } else if (act < 0) { r = - act - 1;#if defined (QLALR_DEBUG) int ridx = rule_index[r]; printf ("%3d) %s ::=", r + 1, spell[rule_info[ridx]]); ++ridx; for (int i = ridx; i < ridx + rhs[r]; ++i) { int symbol = rule_info[i]; if (const char *name = spell[symbol]) printf (" %s", name); else printf (" #%d", symbol); } printf ("\n");#endif tos -= rhs[r]; act = state_stack[tos++]; ResumeReduction: switch (r) {./document ::= PARSE_ENTITY content;/. case $rule_number: setType(QXmlStreamReader::EndDocument); break;./document ::= prolog;/. case $rule_number: if (type != QXmlStreamReader::Invalid) { if (hasSeenTag || inParseEntity) { setType(QXmlStreamReader::EndDocument); } else { raiseError(QXmlStreamReader::PrematureEndOfDocumentError, QXmlStream::tr("Start tag expected.")); // reset the parser tos = 0; state_stack[tos++] = 0; state_stack[tos] = 0; return false; } } break;./prolog ::= prolog stag content etag;prolog ::= prolog empty_element_tag;prolog ::= prolog comment;prolog ::= prolog xml_decl;prolog ::= prolog processing_instruction;prolog ::= prolog doctype_decl;prolog ::= prolog SPACE;prolog ::=;entity_done ::= ENTITY_DONE;/. case $rule_number: entityReferenceStack.pop()->isCurrentlyReferenced = false; clearSym(); break;./xml_decl_start ::= XML;/. case $rule_number: if (!scanString(spell[VERSION], VERSION, false) && atEnd) { resume($rule_number); return false; } break;./xml_decl ::= xml_decl_start VERSION space_opt EQ space_opt literal attribute_list_opt QUESTIONMARK RANGLE;/. case $rule_number: setType(QXmlStreamReader::StartDocument); startDocument(symString(6)); break;./external_id ::= SYSTEM literal;/. case $rule_number: hasExternalDtdSubset = true; break;./external_id ::= PUBLIC public_literal space literal;/. case $rule_number: checkPublicLiteral(symString(2)); hasExternalDtdSubset = true; break;./external_id ::=;doctype_decl_start ::= langle_bang DOCTYPE name space;/. case $rule_number: if (!scanPublicOrSystem() && atEnd) { resume($rule_number); return false; } break;./doctype_decl ::= doctype_decl_start external_id space_opt markup space_opt RANGLE;/. case $rule_number:./doctype_decl ::= doctype_decl_start external_id space_opt RANGLE;/. case $rule_number:./doctype_decl ::= langle_bang DOCTYPE name RANGLE;/. case $rule_number:./doctype_decl ::= langle_bang DOCTYPE name markup space_opt RANGLE;/. case $rule_number: setType(QXmlStreamReader::DTD); text = &textBuffer; break;./markup_start ::= LBRACK;/. case $rule_number: scanDtd = true; break;./markup ::= markup_start markup_list RBRACK;/. case $rule_number: scanDtd = false; break;./markup_list ::= markup_decl | space | pereference;markup_list ::= markup_list markup_decl | markup_list space | markup_list pereference;markup_decl ::= element_decl | attlist_decl | entity_decl | entity_done | notation_decl | processing_instruction | comment;element_decl_start ::= langle_bang ELEMENT name space;/. case $rule_number: if (!scanString(spell[EMPTY], EMPTY, false) && !scanString(spell[ANY], ANY, false) && atEnd) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -