📄 contenttoken.h
字号:
// Copyright (c) 1994 James Clark// See the file COPYING for copying permission.#ifndef ContentToken_INCLUDED#define ContentToken_INCLUDED 1#ifdef __GNUG__#pragma interface#endif#include "Owner.h"#include "Text.h"#include "Vector.h"#include "NCVector.h"#include "Boolean.h"#ifdef SP_NAMESPACEnamespace SP_NAMESPACE {#endifclass LeafContentToken;struct SP_API Transition { enum { invalidIndex = -1 }; // When performing this transition, reset all andState with index >= this. unsigned clearAndStateStartIndex; // This transition is possible only if all AND groups whose AND depth // is >= this (and contains the LeafContentToken that this transition is // from) have had all their non-nullable members matched. unsigned andDepth; // If this is 1, then this transition requires that the AND group // whose AND depth is andDepth - 1 have a non-nullable member unmatched, // and thus this transition is not ambiguous with a transition whose // AND depth is < andDepth. PackedBoolean isolated; // Index in andState that must be clear for this transition to be // allowed. unsigned requireClear; // Index in andState that is to be set after performing this transition. unsigned toSet;};class SP_API FirstSet {public: FirstSet(); void init(LeafContentToken *); void append(const FirstSet &); size_t size() const; LeafContentToken *token(size_t i) const; size_t requiredIndex() const; void setNotRequired();private: Vector<LeafContentToken *> v_; // index of contextually required token or -1 if none size_t requiredIndex_;};class SP_API LastSet : public Vector<LeafContentToken *> {public: LastSet() { } LastSet(size_t n) : Vector<LeafContentToken *>(n) { } void append(const LastSet &);};class ElementType;class AndModelGroup;struct GroupInfo;struct SP_API ContentModelAmbiguity { const LeafContentToken *from; const LeafContentToken *to1; const LeafContentToken *to2; unsigned andDepth;};class ModelGroup;class SP_API ContentToken {public: enum OccurrenceIndicator { none = 0, opt = 01, plus = 02, rep = 03 }; ContentToken(OccurrenceIndicator); virtual ~ContentToken(); OccurrenceIndicator occurrenceIndicator() const; Boolean inherentlyOptional() const; static unsigned andDepth(const AndModelGroup *); static unsigned andIndex(const AndModelGroup *); void analyze(GroupInfo &, const AndModelGroup *, unsigned, FirstSet &, LastSet &); static void addTransitions(const LastSet &from, const FirstSet &to, Boolean maybeRequired, unsigned andClearIndex, unsigned andDepth, Boolean isolated = 0, unsigned requireClear = (unsigned)Transition::invalidIndex, unsigned toSet = (unsigned)Transition::invalidIndex); virtual void finish(Vector<unsigned> &minAndDepth, Vector<size_t> &elementTransition, Vector<ContentModelAmbiguity> &, Boolean &pcdataUnreachable) = 0; virtual unsigned long grpgtcnt() const; virtual void setOrGroupMember(); unsigned andGroupIndex() const; virtual const ModelGroup *asModelGroup() const; virtual const LeafContentToken *asLeafContentToken() const;protected: PackedBoolean inherentlyOptional_;private: ContentToken(const ContentToken &); // undefined void operator=(const ContentToken &); // undefined virtual void analyze1(GroupInfo &, const AndModelGroup *, unsigned, FirstSet &, LastSet &) = 0; OccurrenceIndicator occurrenceIndicator_;};class SP_API ModelGroup : public ContentToken {public: enum Connector { andConnector, orConnector, seqConnector }; ModelGroup(NCVector<Owner<ContentToken> > &, OccurrenceIndicator); virtual Connector connector() const = 0; unsigned nMembers() const; void finish(Vector<unsigned> &minAndDepth, Vector<size_t> &elementTransition, Vector<ContentModelAmbiguity> &, Boolean &pcdataUnreachable); ContentToken &member(unsigned i); const ContentToken &member(unsigned i) const; unsigned long grpgtcnt() const; const ModelGroup *asModelGroup() const;protected: void setOrGroup();private: ModelGroup(const ModelGroup &); // undefined void operator=(const ModelGroup &); // undefined NCVector<Owner<ContentToken> > members_;};class AndModelGroup : public ModelGroup {public: AndModelGroup(NCVector<Owner<ContentToken> > &, OccurrenceIndicator); Connector connector() const; unsigned andDepth() const; unsigned andIndex() const; unsigned andGroupIndex() const; const AndModelGroup *andAncestor() const;private: AndModelGroup(const AndModelGroup &); // undefined void operator=(const AndModelGroup &); // undefined unsigned andDepth_; // number of and groups that contain this unsigned andIndex_; unsigned andGroupIndex_; const AndModelGroup *andAncestor_; void analyze1(GroupInfo &, const AndModelGroup *, unsigned, FirstSet &, LastSet &);};class OrModelGroup : public ModelGroup {public: OrModelGroup(NCVector<Owner<ContentToken> > &, OccurrenceIndicator); Connector connector() const;private: OrModelGroup(const OrModelGroup &); // undefined void operator=(const OrModelGroup &); // undefined void analyze1(GroupInfo &, const AndModelGroup *, unsigned, FirstSet &, LastSet &);};class SeqModelGroup : public ModelGroup {public: SeqModelGroup(NCVector<Owner<ContentToken> > &, OccurrenceIndicator); Connector connector() const;private: SeqModelGroup(const SeqModelGroup &); // undefined void operator=(const SeqModelGroup &); // undefined void analyze1(GroupInfo &, const AndModelGroup *, unsigned, FirstSet &, LastSet &);};class AndState;class SP_API AndInfo {public: AndInfo() { } const AndModelGroup *andAncestor; unsigned andGroupIndex; Vector<Transition> follow;private: AndInfo(const AndInfo &); // undefined void operator=(const AndInfo &); // undefined};// A LeafContentToken is not quite the same as a primitive content token.// A data tag group is a primitive content token but not a LeafContentToken.class SP_API LeafContentToken : public ContentToken {public: LeafContentToken(const ElementType *, OccurrenceIndicator); unsigned index() const; unsigned typeIndex() const; const ElementType *elementType() const; virtual Boolean isInitial() const; void addTransitions(const FirstSet &to, Boolean maybeRequired, unsigned andClearIndex, unsigned andDepth, Boolean isolated, unsigned requireClear, unsigned toSet); void setFinal(); void finish(Vector<unsigned> &minAndDepth, Vector<size_t> &elementTransition, Vector<ContentModelAmbiguity> &, Boolean &pcdataUnreachable); Boolean isFinal() const; Boolean tryTransition(const ElementType *, AndState &, unsigned &minAndDepth, const LeafContentToken *&newpos) const; Boolean tryTransitionPcdata(AndState &, unsigned &minAndDepth, const LeafContentToken *&newpos) const; void possibleTransitions(const AndState &, unsigned minAndDepth, Vector<const ElementType *> &) const; const LeafContentToken *impliedStartTag(const AndState &andpos, unsigned minAndDepth) const; const LeafContentToken *transitionToken(const ElementType *to, const AndState &andState, unsigned minAndDepth) const; void doRequiredTransition(AndState &andState, unsigned &minAndDepth, const LeafContentToken *&newpos) const; unsigned computeMinAndDepth(const AndState&) const; Boolean orGroupMember() const; void setOrGroupMember(); const AndModelGroup *andAncestor() const; unsigned andDepth() const; const LeafContentToken *asLeafContentToken() const;protected: void analyze1(GroupInfo &, const AndModelGroup *, unsigned, FirstSet &, LastSet &); const ElementType *element_;private: LeafContentToken(const LeafContentToken &); // undefined void operator=(const LeafContentToken &); // undefined void andFinish(Vector<unsigned> &minAndDepth, Vector<size_t> &elementTransition, Vector<ContentModelAmbiguity> &, Boolean &pcdataUnreachable); unsigned computeMinAndDepth1(const AndState&) const; unsigned leafIndex_; unsigned typeIndex_; Vector<LeafContentToken *> follow_; PackedBoolean isFinal_; PackedBoolean orGroupMember_; // 0 none, 1 yes - simple, 2 - compled char pcdataTransitionType_; const LeafContentToken *simplePcdataTransition_; size_t requiredIndex_; Owner<AndInfo> andInfo_;};class PcdataToken : public LeafContentToken {public: PcdataToken(); void analyze1(GroupInfo &, const AndModelGroup *, unsigned, FirstSet &, LastSet &);private: PcdataToken(const PcdataToken &); // undefined void operator=(const PcdataToken &); // undefined};class InitialPseudoToken : public LeafContentToken {public: InitialPseudoToken(); Boolean isInitial() const;private: InitialPseudoToken(const InitialPseudoToken &); // undefined void operator=(const InitialPseudoToken &); // undefined};class ElementToken : public LeafContentToken {public: ElementToken(const ElementType *, OccurrenceIndicator);private: ElementToken(const ElementToken &); // undefined void operator=(const ElementToken &); // undefined};class DataTagGroup : public SeqModelGroup {public: // first content token is a DataTagElementToken, second is PcdataToken DataTagGroup(NCVector<Owner<ContentToken> > &, OccurrenceIndicator);private: DataTagGroup(const DataTagGroup &); // undefined void operator=(const DataTagGroup &); // undefined};class DataTagElementToken : public ElementToken {public: DataTagElementToken(const ElementType *, Vector<Text> &templates); DataTagElementToken(const ElementType *, Vector<Text> &templates, Text &paddingTemplate);private: DataTagElementToken(const DataTagElementToken &); // undefined void operator=(const DataTagElementToken &); // undefined Vector<Text> templates_; Boolean havePaddingTemplate_; Text paddingTemplate_;};class SP_API CompiledModelGroup {public: CompiledModelGroup(Owner<ModelGroup> &); void compile(size_t nElementTypeIndex, Vector<ContentModelAmbiguity> &, Boolean &pcdataUnreachable); CompiledModelGroup *copy() const; const LeafContentToken *initial() const;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -