📄 parserstate.h
字号:
// Copyright (c) 1994 James Clark// See the file COPYING for copying permission.#ifndef ParserState_INCLUDED#define ParserState_INCLUDED 1#ifdef __GNUG__#pragma interface#endif#include <stddef.h>#include <signal.h>#include "Allocator.h"#include "Attribute.h"#include "Boolean.h"#include "Vector.h"#include "StringC.h"#include "Dtd.h"#include "Entity.h"#include "EntityCatalog.h"#include "EntityManager.h"#include "Event.h"#include "EventQueue.h"#include "Id.h"#include "InputSource.h"#include "IList.h"#include "IQueue.h"#include "Location.h"#include "Message.h"#include "Mode.h"#include "OpenElement.h"#include "OutputState.h"#include "ParserOptions.h"#include "Ptr.h"#include "Recognizer.h"#include "Sd.h"#include "Syntax.h"#include "NCVector.h"#include "Owner.h"#include "Lpd.h"#include "LpdEntityRef.h"#include "Markup.h"#include "ContentState.h"#ifdef SP_NAMESPACEnamespace SP_NAMESPACE {#endifclass ParserState : public ContentState, public AttributeContext { public: enum Phase { noPhase, initPhase, prologPhase, declSubsetPhase, instanceStartPhase, contentPhase }; ParserState(const Ptr<EntityManager> &, const ParserOptions &, unsigned subdocLevel, Phase finalPhase); void setHandler(EventHandler *, const volatile sig_atomic_t *cancelPtr); void unsetHandler(); Boolean inInstance() const; Boolean hadDtd() const; void allDone(); void startDtd(const StringC &); void endDtd(); void startInstance(); unsigned subdocLevel() const; Boolean haveDefLpd() const; Dtd &defDtd(); const Ptr<Dtd> &defDtdPointer() const; Boolean haveCurrentDtd() const; const Dtd ¤tDtd() const; Dtd ¤tDtdNonConst() const; const ConstPtr<Dtd> ¤tDtdPointer() const; void startLpd(Ptr<Lpd> &lpd); void endLpd(); Lpd &defLpd(); Ptr<Lpd> &defLpdPointer(); Ptr<ComplexLpd> defComplexLpdPointer(); size_t nActiveLink() const; const Lpd &activeLpd(size_t i) const; ComplexLpd &defComplexLpd(); Ptr<Dtd> lookupDtd(const StringC &name); Ptr<Dtd> baseDtd(); void activateLinkType(const StringC &); void allLinkTypesActivated(); void setResultAttributeSpecMode(); void clearResultAttributeSpecMode(); Boolean haveApplicableDtd() const; Boolean hadLpd() const; Boolean pass2() const; void setPass2Start(); Boolean maybeStartPass2(); void checkEntityStability(); void noteReferencedEntity(const ConstPtr<Entity> &entity, Boolean, Boolean); ConstPtr<Lpd> lookupLpd(const StringC &name) const; Boolean shouldActivateLink(const StringC &) const; Char currentChar() const; const Location ¤tLocation() const; InputSource *currentInput() const; EntityManager &entityManager() const; Ptr<EntityManager> entityManagerPtr() const; const EntityCatalog &entityCatalog() const; ConstPtr<EntityCatalog> entityCatalogPtr() const; void setEntityCatalog(const ConstPtr<EntityCatalog> &); void setSyntax(ConstPtr<Syntax>); void setSyntaxes(ConstPtr<Syntax>, ConstPtr<Syntax>); void setSd(ConstPtr<Sd>); const Syntax &syntax() const; const Syntax &instanceSyntax() const; const ConstPtr<Syntax> &syntaxPointer() const; const ConstPtr<Syntax> &prologSyntaxPointer() const; const ConstPtr<Syntax> &instanceSyntaxPointer() const; const Sd &sd() const; const ConstPtr<Sd> &sdPointer() const; void setPhase(Phase phase); Phase phase() const; Phase finalPhase() const; Mode currentMode() const; void setRecognizer(Mode, ConstPtr<Recognizer>); void setNormalMap(const XcharMap<PackedBoolean> &); const XcharMap<PackedBoolean> &normalMap() const; Xchar getChar(); void skipChar(); Token getToken(Mode mode); StringC currentToken() const; void getCurrentToken(StringC &) const; void getCurrentToken(const SubstTable<Char> *, StringC &) const; unsigned inputLevel() const; unsigned specialParseInputLevel() const; unsigned markedSectionLevel() const; unsigned markedSectionSpecialLevel() const; unsigned currentInputElementIndex() const; const Location ¤tMarkedSectionStartLocation() const; Boolean entityIsOpen(const EntityDecl *) const; void popInputStack(); void pushInput(InputSource *); Boolean referenceDsEntity(const Location &); void setDsEntity(const ConstPtr<Entity> &); Boolean eventQueueEmpty() const; Event *eventQueueGet(); EventHandler &eventHandler(); void pushElement(OpenElement *); OpenElement *popSaveElement(); void popElement(); void pcdataRecover(); Boolean pcdataRecovering() const; ConstPtr<Entity> lookupEntity(Boolean isParameter, const StringC &name, const Location &, Boolean referenced); ConstPtr<Entity> createUndefinedEntity(const StringC &, const Location &); Boolean appendCurrentRank(StringC &, const RankStem *) const; void setCurrentRank(const RankStem *, const StringC &); void startMarkedSection(const Location &); void startSpecialMarkedSection(Mode, const Location &); void endMarkedSection(); void queueRe(const Location &); void noteMarkup(); void noteData(); void noteRs(); void noteStartElement(Boolean included); void noteEndElement(Boolean included); // size of objects allocated with this must not exceed // sizeof(StartElementEvent) Allocator &eventAllocator(); // size of objects allocated with this must not exceed // sizeof(OpenElement) Allocator &internalAllocator(); AttributeList *allocAttributeList(const ConstPtr<AttributeDefinitionList> &, unsigned i); static void freeEvent(void *); Boolean wantMarkup() const; const EventsWanted &eventsWanted() const; StringC &nameBuffer(); typedef NamedTableIter<Id> IdTableIter; IdTableIter idTableIter(); const ParserOptions &options() const; void enableImplydef(); Boolean implydefElement(); Boolean implydefAttlist(); void keepMessages(); void releaseKeptMessages(); void discardKeptMessages(); Messenger &messenger(); Markup *currentMarkup(); const Location &markupLocation() const; Markup *startMarkup(Boolean, const Location &); void inheritActiveLinkTypes(const ParserState &parent); Boolean cancelled() const; // AFDR extensions void setHadAfdrDecl(); Boolean hadAfdrDecl() const; // Implementation of AttributeContext. Boolean defineId(const StringC &, const Location &, Location &); void noteIdref(const StringC &, const Location &); void noteCurrentAttribute(size_t, AttributeValue *); ConstPtr<AttributeValue> getCurrentAttribute(size_t) const; ConstPtr<Entity> getAttributeEntity(const StringC &, const Location &); ConstPtr<Notation> getAttributeNotation(const StringC &, const Location &); const Syntax &attributeSyntax() const;private: ParserState(const ParserState &); // undefined void operator=(const ParserState &); // undefined void dispatchMessage(Message &); void dispatchMessage(const Message &); void initMessage(Message &); void queueMessage(MessageEvent *); Id *lookupCreateId(const StringC &); ParserOptions options_; EventHandler *handler_; Pass1EventHandler pass1Handler_; Boolean allowPass2_; Offset pass2StartOffset_; Boolean hadPass2Start_; EventQueue eventQueue_; OutputState outputState_; ConstPtr<Syntax> prologSyntax_; ConstPtr<Syntax> instanceSyntax_; ConstPtr<Sd> sd_; unsigned subdocLevel_; Ptr<EntityManager> entityManager_; ConstPtr<EntityCatalog> entityCatalog_; Phase phase_; Phase finalPhase_; Boolean inInstance_; Ptr<Dtd> defDtd_; Ptr<Lpd> defLpd_; Vector<ConstPtr<Lpd> > allLpd_; Vector<ConstPtr<Lpd> > lpd_; // active LPDs Vector<StringC> activeLinkTypes_; Boolean activeLinkTypesSubsted_; Boolean hadLpd_; Boolean resultAttributeSpecMode_; Boolean pass2_; typedef OwnerTable<LpdEntityRef, LpdEntityRef, LpdEntityRef, LpdEntityRef> LpdEntityRefSet; typedef OwnerTableIter<LpdEntityRef, LpdEntityRef, LpdEntityRef, LpdEntityRef> LpdEntityRefSetIter; LpdEntityRefSet lpdEntityRefs_; // external entity to be referenced at the end of the declaration subset ConstPtr<Entity> dsEntity_; Allocator eventAllocator_; Allocator internalAllocator_; NCVector<Owner<AttributeList> > attributeLists_; StringC nameBuffer_; Boolean keepingMessages_; IQueue<MessageEvent> keptMessages_; Mode currentMode_; Boolean pcdataRecovering_; // if in a special parse (cdata, rcdata, ignore), the input level // at which the special parse started. unsigned specialParseInputLevel_; Mode specialParseMode_; unsigned markedSectionLevel_; unsigned markedSectionSpecialLevel_; Vector<Location> markedSectionStartLocation_; ConstPtr<Recognizer> recognizers_[nModes]; XcharMap<PackedBoolean> normalMap_; unsigned inputLevel_; IList<InputSource> inputStack_; Vector<unsigned> inputLevelElementIndex_; Ptr<Dtd> currentDtd_; ConstPtr<Dtd> currentDtdConst_; Vector<Ptr<Dtd> > dtd_; Ptr<Dtd> pass1Dtd_; ConstPtr<Syntax> syntax_; Vector<StringC> currentRank_; NamedTable<Id> idTable_; NamedResourceTable<Entity> instanceDefaultedEntityTable_; NamedResourceTable<Entity> undefinedEntityTable_; Vector<ConstPtr<AttributeValue> > currentAttributes_; Markup *currentMarkup_; Markup markup_; Location markupLocation_; Boolean hadAfdrDecl_; Boolean implydefElement_; Boolean implydefAttlist_; const volatile sig_atomic_t *cancelPtr_; static sig_atomic_t dummyCancel_; static const Location nullLocation_;};inlineMessenger &ParserState::messenger(){ return *this;}inlineBoolean ParserState::wantMarkup() const{ return (inInstance_ ? options_.eventsWanted.wantInstanceMarkup() : options_.eventsWanted.wantPrologMarkup());}inlineconst EventsWanted &ParserState::eventsWanted() const{ return options_.eventsWanted;}inlineInputSource *ParserState::currentInput() const{ return inputStack_.head();}inlineconst Location &ParserState::currentLocation() const{ InputSource *in = currentInput(); return in ? in->currentLocation() : nullLocation_;}inlineBoolean ParserState::pcdataRecovering() const{ return pcdataRecovering_;}inlineunsigned ParserState::inputLevel() const{ return inputLevel_;}inlineunsigned ParserState::specialParseInputLevel() const{ return specialParseInputLevel_;}inlineunsigned ParserState::markedSectionLevel() const{ return markedSectionLevel_;}inlineunsigned ParserState::markedSectionSpecialLevel() const{ return markedSectionSpecialLevel_;}inlineconst Location &ParserState::currentMarkedSectionStartLocation() const{ return markedSectionStartLocation_.back();}inlineunsigned ParserState::currentInputElementIndex() const{ return inputLevelElementIndex_.back();}inlineChar ParserState::currentChar() const{ return currentInput()->currentTokenStart()[0];}inlineStringC ParserState::currentToken() const{ return StringC(currentInput()->currentTokenStart(), currentInput()->currentTokenLength());}inlinevoid ParserState::getCurrentToken(StringC &str) const{ InputSource *in = currentInput(); str.assign(in->currentTokenStart(), in->currentTokenLength());}inlinevoid ParserState::setRecognizer(Mode mode, ConstPtr<Recognizer> p){ recognizers_[mode] = p;}inlinevoid ParserState::setNormalMap(const XcharMap<PackedBoolean> &map){ normalMap_ = map;}inlineconst XcharMap<PackedBoolean> &ParserState::normalMap() const{ return normalMap_;}inlineBoolean ParserState::haveDefLpd() const{ return !defLpd_.isNull();}inlineBoolean ParserState::haveCurrentDtd() const{ return !currentDtd_.isNull();}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -