summaryrefslogtreecommitdiff
path: root/cpp/src/Slice/Parser.h
diff options
context:
space:
mode:
authorBernard Normier <bernard@zeroc.com>2016-05-12 10:21:51 -0400
committerBernard Normier <bernard@zeroc.com>2016-05-12 10:21:51 -0400
commit6ea27c2fc2478cea6a42bad30e746f7ebf9c69af (patch)
treea52106addf73a73fbeb5e33c26ff9f8908b62a24 /cpp/src/Slice/Parser.h
parentUWP test suite fixes (diff)
downloadice-6ea27c2fc2478cea6a42bad30e746f7ebf9c69af.tar.bz2
ice-6ea27c2fc2478cea6a42bad30e746f7ebf9c69af.tar.xz
ice-6ea27c2fc2478cea6a42bad30e746f7ebf9c69af.zip
Renamed ICE_UTIL_API to ICE_API and other cleanups
Diffstat (limited to 'cpp/src/Slice/Parser.h')
-rw-r--r--cpp/src/Slice/Parser.h1100
1 files changed, 1100 insertions, 0 deletions
diff --git a/cpp/src/Slice/Parser.h b/cpp/src/Slice/Parser.h
new file mode 100644
index 00000000000..a142ec921d0
--- /dev/null
+++ b/cpp/src/Slice/Parser.h
@@ -0,0 +1,1100 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2016 ZeroC, Inc. All rights reserved.
+//
+// This copy of Ice is licensed to you under the terms described in the
+// ICE_LICENSE file included in this distribution.
+//
+// **********************************************************************
+
+#ifndef SLICE_PARSER_H
+#define SLICE_PARSER_H
+
+#include <IceUtil/Shared.h>
+#include <IceUtil/Handle.h>
+#include <string>
+#include <vector>
+#include <list>
+#include <stack>
+#include <map>
+#include <set>
+#include <stdio.h>
+
+
+namespace Slice
+{
+
+#if defined(_WIN32) && !defined(__MINGW32__)
+
+const IceUtil::Int64 Int32Max = 0x7fffffffi64;
+const IceUtil::Int64 Int32Min = -Int32Max - 1i64;
+
+#else
+
+# if defined(INT32_MIN) && defined(INT32_MAX)
+
+const IceUtil::Int64 Int32Max = INT32_MAX;
+const IceUtil::Int64 Int32Min = INT32_MIN;
+
+# else
+
+const IceUtil::Int64 Int32Max = 0x7fffffffLL;
+const IceUtil::Int64 Int32Min = -Int32Max - 1LL;
+
+# endif
+
+#endif
+
+const IceUtil::Int64 Int16Max = 0x7fff;
+const IceUtil::Int64 Int16Min = -Int16Max - 1;
+const IceUtil::Int64 ByteMax = 0xff;
+const IceUtil::Int64 ByteMin = 0x00;
+
+enum FeatureProfile
+{
+ Ice,
+ IceE
+};
+
+enum NodeType
+{
+ Dummy,
+ Real
+};
+
+//
+// Format preference for classes and exceptions.
+//
+enum FormatType
+{
+ DefaultFormat, // No preference was specified.
+ CompactFormat, // Minimal format.
+ SlicedFormat // Full format.
+};
+
+class GrammarBase;
+class SyntaxTreeBase;
+class Type;
+class Builtin;
+class Contained;
+class Container;
+class Module;
+class Constructed;
+class ClassDecl;
+class ClassDef;
+class Proxy;
+class Exception;
+class Struct;
+class Operation;
+class ParamDecl;
+class DataMember;
+class Sequence;
+class Dictionary;
+class Enum;
+class Enumerator;
+class Const;
+class Unit;
+class CICompare;
+class DerivedToBaseCompare;
+class ModulePartialCompare;
+
+typedef ::IceUtil::Handle<GrammarBase> GrammarBasePtr;
+typedef ::IceUtil::Handle<SyntaxTreeBase> SyntaxTreeBasePtr;
+typedef ::IceUtil::Handle<Type> TypePtr;
+typedef ::IceUtil::Handle<Builtin> BuiltinPtr;
+typedef ::IceUtil::Handle<Contained> ContainedPtr;
+typedef ::IceUtil::Handle<Container> ContainerPtr;
+typedef ::IceUtil::Handle<Module> ModulePtr;
+typedef ::IceUtil::Handle<Constructed> ConstructedPtr;
+typedef ::IceUtil::Handle<ClassDecl> ClassDeclPtr;
+typedef ::IceUtil::Handle<ClassDef> ClassDefPtr;
+typedef ::IceUtil::Handle<Proxy> ProxyPtr;
+typedef ::IceUtil::Handle<Exception> ExceptionPtr;
+typedef ::IceUtil::Handle<Struct> StructPtr;
+typedef ::IceUtil::Handle<Operation> OperationPtr;
+typedef ::IceUtil::Handle<ParamDecl> ParamDeclPtr;
+typedef ::IceUtil::Handle<DataMember> DataMemberPtr;
+typedef ::IceUtil::Handle<Sequence> SequencePtr;
+typedef ::IceUtil::Handle<Dictionary> DictionaryPtr;
+typedef ::IceUtil::Handle<Enum> EnumPtr;
+typedef ::IceUtil::Handle<Enumerator> EnumeratorPtr;
+typedef ::IceUtil::Handle<Const> ConstPtr;
+typedef ::IceUtil::Handle<Unit> UnitPtr;
+
+typedef std::list<TypePtr> TypeList;
+typedef std::list<ExceptionPtr> ExceptionList;
+typedef std::set<std::string> StringSet;
+typedef std::list<std::string> StringList;
+typedef std::pair<TypePtr, std::string> TypeString;
+typedef std::list<TypeString> TypeStringList;
+typedef std::list<ContainedPtr> ContainedList;
+typedef std::list<ModulePtr> ModuleList;
+typedef std::list<ConstructedPtr> ConstructedList;
+typedef std::list<ClassDefPtr> ClassList;
+typedef std::list<ExceptionPtr> ExceptionList;
+typedef std::list<StructPtr> StructList;
+typedef std::list<SequencePtr> SequenceList;
+typedef std::list<DictionaryPtr> DictionaryList;
+typedef std::list<EnumPtr> EnumList;
+typedef std::list<ConstPtr> ConstList;
+typedef std::list<OperationPtr> OperationList;
+typedef std::list<DataMemberPtr> DataMemberList;
+typedef std::list<ParamDeclPtr> ParamDeclList;
+typedef std::list<EnumeratorPtr> EnumeratorList;
+
+struct ConstDef
+{
+ TypePtr type;
+ SyntaxTreeBasePtr value;
+ std::string valueAsString;
+ std::string valueAsLiteral;
+};
+
+struct OptionalDef
+{
+ TypePtr type;
+ std::string name;
+ bool optional;
+ int tag;
+};
+
+// ----------------------------------------------------------------------
+// CICompare -- function object to do case-insensitive string comparison.
+// ----------------------------------------------------------------------
+
+class CICompare : public std::binary_function<std::string, std::string, bool>
+{
+public:
+
+ bool operator()(const std::string&, const std::string&) const;
+};
+
+#if defined(__SUNPRO_CC)
+bool cICompare(const std::string&, const std::string&);
+#endif
+
+// ----------------------------------------------------------------------
+// DerivedToBaseCompare -- function object to do sort exceptions into
+// most-derived to least-derived order.
+// ----------------------------------------------------------------------
+
+class DerivedToBaseCompare : public std::binary_function<std::string, std::string, bool>
+{
+public:
+
+ bool operator()(const ExceptionPtr&, const ExceptionPtr&) const;
+};
+
+#if defined(__SUNPRO_CC)
+bool derivedToBaseCompare(const ExceptionPtr&, const ExceptionPtr&);
+#endif
+
+// ----------------------------------------------------------------------
+// ParserVisitor
+// ----------------------------------------------------------------------
+
+class ParserVisitor
+{
+public:
+
+ virtual ~ParserVisitor() { }
+ virtual bool visitUnitStart(const UnitPtr&) { return true; }
+ virtual void visitUnitEnd(const UnitPtr&) { }
+ virtual bool visitModuleStart(const ModulePtr&) { return true; }
+ virtual void visitModuleEnd(const ModulePtr&) { }
+ virtual void visitClassDecl(const ClassDeclPtr&) { }
+ virtual bool visitClassDefStart(const ClassDefPtr&) { return true; }
+ virtual void visitClassDefEnd(const ClassDefPtr&) { }
+ virtual bool visitExceptionStart(const ExceptionPtr&) { return true; }
+ virtual void visitExceptionEnd(const ExceptionPtr&) { }
+ virtual bool visitStructStart(const StructPtr&) { return true; }
+ virtual void visitStructEnd(const StructPtr&) { }
+ virtual void visitOperation(const OperationPtr&) { }
+ virtual void visitParamDecl(const ParamDeclPtr&) { }
+ virtual void visitDataMember(const DataMemberPtr&) { }
+ virtual void visitSequence(const SequencePtr&) { }
+ virtual void visitDictionary(const DictionaryPtr&) { }
+ virtual void visitEnum(const EnumPtr&) { }
+ virtual void visitConst(const ConstPtr&) { }
+};
+
+// ----------------------------------------------------------------------
+// DefinitionContext
+// ----------------------------------------------------------------------
+
+class DefinitionContext : public ::IceUtil::SimpleShared
+{
+public:
+
+ DefinitionContext(int, const StringList&);
+
+ std::string filename() const;
+ int includeLevel() const;
+ bool seenDefinition() const;
+
+ void setFilename(const std::string&);
+ void setSeenDefinition();
+
+ bool hasMetaData() const;
+ void setMetaData(const StringList&);
+ std::string findMetaData(const std::string&) const;
+ StringList getMetaData() const;
+
+private:
+
+ int _includeLevel;
+ StringList _metaData;
+ std::string _filename;
+ bool _seenDefinition;
+};
+typedef ::IceUtil::Handle<DefinitionContext> DefinitionContextPtr;
+
+// ----------------------------------------------------------------------
+// GrammarBase
+// ----------------------------------------------------------------------
+
+class GrammarBase : public ::IceUtil::SimpleShared
+{
+};
+
+// ----------------------------------------------------------------------
+// SyntaxTreeBase
+// ----------------------------------------------------------------------
+
+class SyntaxTreeBase : public GrammarBase
+{
+public:
+
+ virtual void destroy();
+ UnitPtr unit() const;
+ DefinitionContextPtr definitionContext() const; // May be nil
+ virtual void visit(ParserVisitor*, bool);
+
+protected:
+
+ SyntaxTreeBase(const UnitPtr&);
+
+ UnitPtr _unit;
+ DefinitionContextPtr _definitionContext;
+};
+
+// ----------------------------------------------------------------------
+// Type
+// ----------------------------------------------------------------------
+
+class Type : public virtual SyntaxTreeBase
+{
+public:
+
+ virtual bool isLocal() const = 0;
+ virtual std::string typeId() const = 0;
+ virtual bool usesClasses() const = 0;
+ virtual size_t minWireSize() const = 0;
+ virtual bool isVariableLength() const = 0;
+
+protected:
+
+ Type(const UnitPtr&);
+};
+
+// ----------------------------------------------------------------------
+// Builtin
+// ----------------------------------------------------------------------
+
+class Builtin : public virtual Type
+{
+public:
+
+ enum Kind
+ {
+ KindByte,
+ KindBool,
+ KindShort,
+ KindInt,
+ KindLong,
+ KindFloat,
+ KindDouble,
+ KindString,
+ KindObject,
+ KindObjectProxy,
+ KindLocalObject,
+ KindValue
+ };
+
+ virtual bool isLocal() const;
+ virtual std::string typeId() const;
+ virtual bool usesClasses() const;
+ virtual size_t minWireSize() const;
+ virtual bool isVariableLength() const;
+
+ Kind kind() const;
+ std::string kindAsString() const;
+
+ static const char* builtinTable[];
+
+protected:
+
+ Builtin(const UnitPtr&, Kind);
+ friend class Unit;
+
+ Kind _kind;
+};
+
+// ----------------------------------------------------------------------
+// Contained
+// ----------------------------------------------------------------------
+
+class Contained : public virtual SyntaxTreeBase
+{
+public:
+
+ ContainerPtr container() const;
+ std::string name() const;
+ std::string scoped() const;
+ std::string scope() const;
+ std::string flattenedScope() const;
+ std::string file() const;
+ std::string line() const;
+ std::string comment() const;
+
+ int includeLevel() const;
+ void updateIncludeLevel();
+
+ bool hasMetaData(const std::string&) const;
+ bool findMetaData(const std::string&, std::string&) const;
+ std::list<std::string> getMetaData() const;
+ void setMetaData(const std::list<std::string>&);
+ void addMetaData(const std::string&); // TODO: remove this method once "cs:" and "vb:" are hard errors.
+
+ static FormatType parseFormatMetaData(const std::list<std::string>&);
+
+ enum ContainedType
+ {
+ ContainedTypeSequence,
+ ContainedTypeDictionary,
+ ContainedTypeEnum,
+ ContainedTypeEnumerator,
+ ContainedTypeModule,
+ ContainedTypeClass,
+ ContainedTypeException,
+ ContainedTypeStruct,
+ ContainedTypeOperation,
+ ContainedTypeParamDecl,
+ ContainedTypeDataMember,
+ ContainedTypeConstant
+ };
+ virtual ContainedType containedType() const = 0;
+
+ virtual bool uses(const ContainedPtr&) const = 0;
+ virtual std::string kindOf() const = 0;
+
+ bool operator<(const Contained&) const;
+ bool operator==(const Contained&) const;
+ bool operator!=(const Contained&) const;
+
+protected:
+
+ Contained(const ContainerPtr&, const std::string&);
+ friend class Container;
+
+ ContainerPtr _container;
+ std::string _name;
+ std::string _scoped;
+ std::string _file;
+ std::string _line;
+ std::string _comment;
+ int _includeLevel;
+ std::list<std::string> _metaData;
+};
+
+// ----------------------------------------------------------------------
+// Container
+// ----------------------------------------------------------------------
+
+class Container : public virtual SyntaxTreeBase
+{
+public:
+
+ virtual void destroy();
+ ModulePtr createModule(const std::string&);
+ ClassDefPtr createClassDef(const std::string&, int, bool, const ClassList&, bool);
+ ClassDeclPtr createClassDecl(const std::string&, bool, bool, bool = true);
+ ExceptionPtr createException(const std::string&, const ExceptionPtr&, bool, NodeType = Real);
+ StructPtr createStruct(const std::string&, bool, NodeType = Real);
+ SequencePtr createSequence(const std::string&, const TypePtr&, const StringList&, bool, NodeType = Real);
+ DictionaryPtr createDictionary(const std::string&, const TypePtr&, const StringList&, const TypePtr&,
+ const StringList&, bool, NodeType = Real);
+ EnumPtr createEnum(const std::string&, bool, NodeType = Real);
+ EnumeratorPtr createEnumerator(const std::string&);
+ EnumeratorPtr createEnumerator(const std::string&, int);
+ ConstPtr createConst(const std::string, const TypePtr&, const StringList&, const SyntaxTreeBasePtr&,
+ const std::string&, const std::string&, NodeType = Real);
+ TypeList lookupType(const std::string&, bool = true);
+ TypeList lookupTypeNoBuiltin(const std::string&, bool = true, bool = false);
+ ContainedList lookupContained(const std::string&, bool = true);
+ ExceptionPtr lookupException(const std::string&, bool = true);
+ UnitPtr unit() const;
+ ModuleList modules() const;
+ ClassList classes() const;
+ ExceptionList exceptions() const;
+ StructList structs() const;
+ SequenceList sequences() const;
+ DictionaryList dictionaries() const;
+ EnumList enums() const;
+ ConstList consts() const;
+ ContainedList contents() const;
+ bool hasNonLocalClassDecls() const;
+ bool hasNonLocalClassDefs() const;
+ bool hasLocalClassDefsWithAsync() const;
+ bool hasNonLocalSequences() const;
+ bool hasNonLocalExceptions() const;
+ bool hasDictionaries() const;
+ bool hasOnlyDictionaries(DictionaryList&) const;
+ bool hasClassDecls() const;
+ bool hasClassDefs() const;
+ bool hasLocalClassDefs() const;
+ bool hasNonLocalInterfaceDefs() const;
+ bool hasValueDefs() const;
+ bool hasOnlyClassDecls() const;
+ bool hasAbstractClassDefs() const;
+ bool hasNonLocalDataOnlyClasses() const;
+ bool hasOtherConstructedOrExceptions() const; // Exceptions or constructed types other than classes.
+ bool hasContentsWithMetaData(const std::string&) const;
+ bool hasAsyncOps() const;
+ bool hasNonLocalContained(Contained::ContainedType) const;
+ std::string thisScope() const;
+ void mergeModules();
+ void sort();
+ void sortContents(bool);
+ virtual void visit(ParserVisitor*, bool);
+ void containerRecDependencies(std::set<ConstructedPtr>&); // Internal operation, don't use directly.
+
+ bool checkIntroduced(const std::string&, ContainedPtr = 0);
+ bool nameIsLegal(const std::string&, const char *);
+ bool checkForGlobalDef(const std::string&, const char *);
+
+protected:
+
+ Container(const UnitPtr&);
+
+ void checkIdentifier(const std::string&) const;
+ bool checkInterfaceAndLocal(const std::string&, bool, bool, bool, bool, bool);
+ bool checkGlobalMetaData(const StringList&, const StringList&);
+ bool validateConstant(const std::string&, const TypePtr&, const SyntaxTreeBasePtr&, const std::string&, bool);
+ EnumeratorPtr validateEnumerator(const std::string&);
+
+ ContainedList _contents;
+ std::map<std::string, ContainedPtr, CICompare> _introducedMap;
+};
+
+// ----------------------------------------------------------------------
+// Module
+// ----------------------------------------------------------------------
+
+class Module : public virtual Container, public virtual Contained
+{
+public:
+
+ virtual ContainedType containedType() const;
+ virtual bool uses(const ContainedPtr&) const;
+ virtual std::string kindOf() const;
+ virtual void visit(ParserVisitor*, bool);
+
+protected:
+
+ Module(const ContainerPtr&, const std::string&);
+ friend class Container;
+};
+
+// ----------------------------------------------------------------------
+// Constructed
+// ----------------------------------------------------------------------
+
+class Constructed : public virtual Type, public virtual Contained
+{
+public:
+
+ virtual bool isLocal() const;
+ virtual std::string typeId() const;
+ virtual bool isVariableLength() const = 0;
+ ConstructedList dependencies();
+ virtual void recDependencies(std::set<ConstructedPtr>&) = 0; // Internal operation, don't use directly.
+
+protected:
+
+ Constructed(const ContainerPtr&, const std::string&, bool);
+
+ bool _local;
+};
+
+// ----------------------------------------------------------------------
+// ClassDecl
+// ----------------------------------------------------------------------
+
+class ClassDecl : public virtual Constructed
+{
+public:
+
+ virtual void destroy();
+ ClassDefPtr definition() const;
+ bool isInterface() const;
+ virtual ContainedType containedType() const;
+ virtual bool uses(const ContainedPtr&) const;
+ virtual bool usesClasses() const;
+ virtual size_t minWireSize() const;
+ virtual bool isVariableLength() const;
+ virtual void visit(ParserVisitor*, bool);
+ virtual std::string kindOf() const;
+ virtual void recDependencies(std::set<ConstructedPtr>&); // Internal operation, don't use directly.
+
+ static void checkBasesAreLegal(const std::string&, bool, bool, const ClassList&, const UnitPtr&);
+
+protected:
+
+ ClassDecl(const ContainerPtr&, const std::string&, bool, bool);
+ friend class Container;
+ friend class ClassDef;
+
+ ClassDefPtr _definition;
+ bool _interface;
+
+private:
+
+ typedef std::list<ClassList> GraphPartitionList;
+ typedef std::list<StringList> StringPartitionList;
+
+ static bool isInList(const GraphPartitionList&, const ClassDefPtr);
+ static void addPartition(GraphPartitionList&, GraphPartitionList::reverse_iterator, const ClassDefPtr);
+ static StringPartitionList toStringPartitionList(const GraphPartitionList&);
+ static void checkPairIntersections(const StringPartitionList&, const std::string&, const UnitPtr&);
+};
+
+// ----------------------------------------------------------------------
+// Operation
+// ----------------------------------------------------------------------
+
+class Operation : public virtual Contained, public virtual Container
+{
+public:
+
+ //
+ // Note: The order of definitions here *must* match the order of
+ // definitions of ::Ice::OperationMode in slice/Ice/Current.ice!
+ //
+ enum Mode
+ {
+ Normal,
+ Nonmutating,
+ Idempotent
+ };
+
+ TypePtr returnType() const;
+ bool returnIsOptional() const;
+ int returnTag() const;
+ Mode mode() const;
+ Mode sendMode() const;
+ ParamDeclPtr createParamDecl(const std::string&, const TypePtr&, bool, bool, int);
+ ParamDeclList parameters() const;
+ ExceptionList throws() const;
+ void setExceptionList(const ExceptionList&);
+ virtual ContainedType containedType() const;
+ virtual bool uses(const ContainedPtr&) const;
+ bool sendsClasses(bool) const;
+ bool returnsClasses(bool) const;
+ bool returnsData() const;
+ bool sendsOptionals() const;
+ int attributes() const;
+ FormatType format() const;
+ virtual std::string kindOf() const;
+ virtual void visit(ParserVisitor*, bool);
+
+protected:
+
+ Operation(const ContainerPtr&, const std::string&, const TypePtr&, bool, int, Mode);
+ friend class ClassDef;
+
+ TypePtr _returnType;
+ bool _returnIsOptional;
+ int _returnTag;
+ ExceptionList _throws;
+ Mode _mode;
+};
+
+// ----------------------------------------------------------------------
+// ClassDef
+// ----------------------------------------------------------------------
+
+//
+// Note: For the purpose of this parser, a class definition is not
+// considered to be a type, but a class declaration is. And each class
+// definition has at least one class declaration (but not vice versa),
+// so if you need the class as a "constructed type", use the
+// declaration() operation to navigate to the class declaration.
+//
+class ClassDef : public virtual Container, public virtual Contained
+{
+public:
+
+ virtual void destroy();
+ OperationPtr createOperation(const std::string&, const TypePtr&, bool, int, Operation::Mode = Operation::Normal);
+ DataMemberPtr createDataMember(const std::string&, const TypePtr&, bool, int, const SyntaxTreeBasePtr&,
+ const std::string&, const std::string&);
+ ClassDeclPtr declaration() const;
+ ClassList bases() const;
+ ClassList allBases() const;
+ OperationList operations() const;
+ OperationList allOperations() const;
+ DataMemberList dataMembers() const;
+ DataMemberList orderedOptionalDataMembers() const;
+ DataMemberList allDataMembers() const;
+ DataMemberList classDataMembers() const;
+ DataMemberList allClassDataMembers() const;
+ bool canBeCyclic() const;
+ bool isAbstract() const;
+ bool isInterface() const;
+ bool isA(const std::string&) const;
+ virtual bool isLocal() const;
+ bool hasDataMembers() const;
+ bool hasOperations() const;
+ bool hasDefaultValues() const;
+ bool inheritsMetaData(const std::string&) const;
+ virtual ContainedType containedType() const;
+ virtual bool uses(const ContainedPtr&) const;
+ virtual std::string kindOf() const;
+ virtual void visit(ParserVisitor*, bool);
+ int compactId() const;
+ bool isDelegate() const;
+
+protected:
+
+ ClassDef(const ContainerPtr&, const std::string&, int, bool, const ClassList&, bool);
+ friend class Container;
+
+ ClassDeclPtr _declaration;
+ bool _interface;
+ bool _hasDataMembers;
+ bool _hasOperations;
+ ClassList _bases;
+ bool _local;
+ int _compactId;
+};
+
+// ----------------------------------------------------------------------
+// Proxy
+// ----------------------------------------------------------------------
+
+class Proxy : public virtual Type
+{
+public:
+
+ virtual bool isLocal() const;
+ virtual std::string typeId() const;
+ virtual bool usesClasses() const;
+ virtual size_t minWireSize() const;
+ virtual bool isVariableLength() const;
+
+ ClassDeclPtr _class() const;
+
+ Proxy(const ClassDeclPtr&);
+
+protected:
+
+ ClassDeclPtr __class;
+};
+
+// ----------------------------------------------------------------------
+// Exception
+// ----------------------------------------------------------------------
+
+// No inheritance from Constructed, as this is not a Type
+class Exception : public virtual Container, public virtual Contained
+{
+public:
+
+ virtual void destroy();
+ DataMemberPtr createDataMember(const std::string&, const TypePtr&, bool, int, const SyntaxTreeBasePtr&,
+ const std::string&, const std::string&);
+ DataMemberList dataMembers() const;
+ DataMemberList orderedOptionalDataMembers() const;
+ DataMemberList allDataMembers() const;
+ DataMemberList classDataMembers() const;
+ DataMemberList allClassDataMembers() const;
+ ExceptionPtr base() const;
+ ExceptionList allBases() const;
+ virtual bool isBaseOf(const ExceptionPtr&) const;
+ virtual bool isLocal() const;
+ virtual ContainedType containedType() const;
+ virtual bool uses(const ContainedPtr&) const;
+ bool usesClasses(bool) const;
+ bool hasDefaultValues() const;
+ bool inheritsMetaData(const std::string&) const;
+ virtual std::string kindOf() const;
+ virtual void visit(ParserVisitor*, bool);
+
+protected:
+
+ Exception(const ContainerPtr&, const std::string&, const ExceptionPtr&, bool);
+ friend class Container;
+
+ ExceptionPtr _base;
+ bool _local;
+};
+
+// ----------------------------------------------------------------------
+// Struct
+// ----------------------------------------------------------------------
+
+class Struct : public virtual Container, public virtual Constructed
+{
+public:
+
+ DataMemberPtr createDataMember(const std::string&, const TypePtr&, bool, int, const SyntaxTreeBasePtr&,
+ const std::string&, const std::string&);
+ DataMemberList dataMembers() const;
+ DataMemberList classDataMembers() const;
+ virtual ContainedType containedType() const;
+ virtual bool uses(const ContainedPtr&) const;
+ virtual bool usesClasses() const;
+ virtual size_t minWireSize() const;
+ virtual bool isVariableLength() const;
+ bool hasDefaultValues() const;
+ virtual std::string kindOf() const;
+ virtual void visit(ParserVisitor*, bool);
+ virtual void recDependencies(std::set<ConstructedPtr>&); // Internal operation, don't use directly.
+
+protected:
+
+ Struct(const ContainerPtr&, const std::string&, bool);
+ friend class Container;
+};
+
+// ----------------------------------------------------------------------
+// Sequence
+// ----------------------------------------------------------------------
+
+class Sequence : public virtual Constructed
+{
+public:
+
+ TypePtr type() const;
+ StringList typeMetaData() const;
+ virtual ContainedType containedType() const;
+ virtual bool uses(const ContainedPtr&) const;
+ virtual bool usesClasses() const;
+ virtual size_t minWireSize() const;
+ virtual bool isVariableLength() const;
+ virtual std::string kindOf() const;
+ virtual void visit(ParserVisitor*, bool);
+ virtual void recDependencies(std::set<ConstructedPtr>&); // Internal operation, don't use directly.
+
+protected:
+
+ Sequence(const ContainerPtr&, const std::string&, const TypePtr&, const StringList&, bool);
+ friend class Container;
+
+ TypePtr _type;
+ StringList _typeMetaData;
+};
+
+// ----------------------------------------------------------------------
+// Dictionary
+// ----------------------------------------------------------------------
+
+class Dictionary : public virtual Constructed
+{
+public:
+
+ TypePtr keyType() const;
+ TypePtr valueType() const;
+ StringList keyMetaData() const;
+ StringList valueMetaData() const;
+ virtual ContainedType containedType() const;
+ virtual bool uses(const ContainedPtr&) const;
+ virtual bool usesClasses() const;
+ virtual size_t minWireSize() const;
+ virtual bool isVariableLength() const;
+ virtual std::string kindOf() const;
+ virtual void visit(ParserVisitor*, bool);
+ virtual void recDependencies(std::set<ConstructedPtr>&); // Internal operation, don't use directly.
+
+ static bool legalKeyType(const TypePtr&, bool&);
+
+protected:
+
+ Dictionary(const ContainerPtr&, const std::string&, const TypePtr&, const StringList&, const TypePtr&,
+ const StringList&, bool);
+ friend class Container;
+
+ TypePtr _keyType;
+ TypePtr _valueType;
+ StringList _keyMetaData;
+ StringList _valueMetaData;
+};
+
+// ----------------------------------------------------------------------
+// Enum
+// ----------------------------------------------------------------------
+
+class Enum : public virtual Constructed
+{
+public:
+
+ virtual void destroy();
+ EnumeratorList getEnumerators();
+ void setEnumerators(const EnumeratorList&);
+ bool explicitValue() const;
+ int minValue() const;
+ int maxValue() const;
+ virtual ContainedType containedType() const;
+ virtual bool uses(const ContainedPtr&) const;
+ virtual bool usesClasses() const;
+ virtual size_t minWireSize() const;
+ virtual bool isVariableLength() const;
+ virtual std::string kindOf() const;
+ virtual void visit(ParserVisitor*, bool);
+ virtual void recDependencies(std::set<ConstructedPtr>&); // Internal operation, don't use directly.
+
+protected:
+
+ Enum(const ContainerPtr&, const std::string&, bool);
+ friend class Container;
+
+ EnumeratorList _enumerators;
+ bool _explicitValue;
+ IceUtil::Int64 _minValue;
+ IceUtil::Int64 _maxValue;
+};
+
+// ----------------------------------------------------------------------
+// Enumerator
+// ----------------------------------------------------------------------
+
+class Enumerator : public virtual Contained
+{
+public:
+
+ EnumPtr type() const;
+ virtual bool uses(const ContainedPtr&) const;
+ virtual ContainedType containedType() const;
+ virtual std::string kindOf() const;
+
+ bool explicitValue() const;
+ int value() const;
+
+protected:
+
+ Enumerator(const ContainerPtr&, const std::string&);
+ Enumerator(const ContainerPtr&, const std::string&, int);
+ friend class Container;
+ friend class Enum;
+
+ EnumPtr _type;
+ bool _explicitValue;
+ int _value;
+};
+
+// ----------------------------------------------------------------------
+// Const
+// ----------------------------------------------------------------------
+
+class Const : public virtual Contained
+{
+public:
+
+ TypePtr type() const;
+ StringList typeMetaData() const;
+ SyntaxTreeBasePtr valueType() const;
+ std::string value() const;
+ std::string literal() const;
+ virtual bool uses(const ContainedPtr&) const;
+ virtual ContainedType containedType() const;
+ virtual std::string kindOf() const;
+ virtual void visit(ParserVisitor*, bool);
+
+protected:
+
+ Const(const ContainerPtr&, const std::string&, const TypePtr&, const StringList&, const SyntaxTreeBasePtr&,
+ const std::string&, const std::string&);
+ friend class Container;
+
+ TypePtr _type;
+ StringList _typeMetaData;
+ SyntaxTreeBasePtr _valueType;
+ std::string _value;
+ std::string _literal;
+};
+
+// ----------------------------------------------------------------------
+// ParamDecl
+// ----------------------------------------------------------------------
+
+class ParamDecl : public virtual Contained
+{
+public:
+
+ TypePtr type() const;
+ bool isOutParam() const;
+ bool optional() const;
+ int tag() const;
+ virtual ContainedType containedType() const;
+ virtual bool uses(const ContainedPtr&) const;
+ virtual std::string kindOf() const;
+ virtual void visit(ParserVisitor*, bool);
+
+protected:
+
+ ParamDecl(const ContainerPtr&, const std::string&, const TypePtr&, bool, bool, int);
+ friend class Operation;
+
+ TypePtr _type;
+ bool _isOutParam;
+ bool _optional;
+ int _tag;
+};
+
+// ----------------------------------------------------------------------
+// DataMember
+// ----------------------------------------------------------------------
+
+class DataMember : public virtual Contained
+{
+public:
+
+ TypePtr type() const;
+ bool optional() const;
+ int tag() const;
+ std::string defaultValue() const;
+ std::string defaultLiteral() const;
+ SyntaxTreeBasePtr defaultValueType() const;
+ virtual ContainedType containedType() const;
+ virtual bool uses(const ContainedPtr&) const;
+ virtual std::string kindOf() const;
+ virtual void visit(ParserVisitor*, bool);
+
+
+protected:
+
+ DataMember(const ContainerPtr&, const std::string&, const TypePtr&, bool, int, const SyntaxTreeBasePtr&,
+ const std::string&, const std::string&);
+ friend class ClassDef;
+ friend class Struct;
+ friend class Exception;
+
+ TypePtr _type;
+ bool _optional;
+ int _tag;
+ SyntaxTreeBasePtr _defaultValueType;
+ std::string _defaultValue;
+ std::string _defaultLiteral;
+};
+
+// ----------------------------------------------------------------------
+// Unit
+// ----------------------------------------------------------------------
+
+class Unit : public virtual Container
+{
+public:
+
+ static UnitPtr createUnit(bool, bool, bool, bool, const StringList& = StringList());
+
+ bool ignRedefs() const;
+ bool allowIcePrefix() const;
+ bool allowUnderscore() const;
+
+ void setComment(const std::string&);
+ std::string currentComment(); // Not const, as this function removes the current comment.
+ std::string currentFile() const;
+ std::string topLevelFile() const;
+ int currentLine() const;
+
+ void nextLine();
+ bool scanPosition(const char*);
+ int currentIncludeLevel() const;
+
+ void addGlobalMetaData(const StringList&);
+
+ void setSeenDefinition();
+
+ void error(const char*); // Not const, because error count is increased.
+ void error(const std::string&); // Ditto.
+
+ void warning(const char*) const;
+ void warning(const std::string&) const;
+
+ ContainerPtr currentContainer() const;
+ void pushContainer(const ContainerPtr&);
+ void popContainer();
+
+ DefinitionContextPtr currentDefinitionContext() const;
+ void pushDefinitionContext();
+ void popDefinitionContext();
+ DefinitionContextPtr findDefinitionContext(const std::string&) const;
+
+ void addContent(const ContainedPtr&);
+ void removeContent(const ContainedPtr&);
+ ContainedList findContents(const std::string&) const;
+ ClassList findDerivedClasses(const ClassDefPtr&) const;
+ ExceptionList findDerivedExceptions(const ExceptionPtr&) const;
+ ContainedList findUsedBy(const ContainedPtr&) const;
+
+ void addTypeId(int, const std::string&);
+ std::string getTypeId(int);
+
+ bool usesNonLocals() const;
+ bool usesConsts() const;
+
+ FeatureProfile profile() const;
+
+ //
+ // Returns the path names of the files included directly by the top-level file.
+ //
+ StringList includeFiles() const;
+
+ //
+ // Returns the path names of all files parsed by this unit.
+ //
+ StringList allFiles() const;
+
+ int parse(const std::string&, FILE*, bool, FeatureProfile profile = Ice);
+
+ virtual void destroy();
+ virtual void visit(ParserVisitor*, bool);
+
+ BuiltinPtr builtin(Builtin::Kind); // Not const, as builtins are created on the fly. (Lazy initialization.)
+
+ void addTopLevelModule(const std::string&, const std::string&);
+ std::set<std::string> getTopLevelModules(const std::string&) const;
+
+private:
+
+ Unit(bool, bool, bool, bool, const StringList&);
+ static void eraseWhiteSpace(::std::string&);
+
+ bool _ignRedefs;
+ bool _all;
+ bool _allowIcePrefix;
+ bool _allowUnderscore;
+ StringList _defaultGlobalMetaData;
+ int _errors;
+ std::string _currentComment;
+ int _currentLine;
+ int _currentIncludeLevel;
+ std::string _currentFile;
+ std::string _topLevelFile;
+ std::stack<DefinitionContextPtr> _definitionContextStack;
+ StringList _includeFiles;
+ std::stack<ContainerPtr> _containerStack;
+ std::map<Builtin::Kind, BuiltinPtr> _builtins;
+ std::map<std::string, ContainedList> _contentMap;
+ FeatureProfile _featureProfile;
+ std::map<std::string, DefinitionContextPtr> _definitionContextMap;
+ std::map<int, std::string> _typeIds;
+ std::map< std::string, std::set<std::string> > _fileTopLevelModules;
+};
+
+extern Unit* unit; // The current parser for bison/flex
+
+}
+
+#endif