summaryrefslogtreecommitdiff
path: root/cpp/include/Slice/Parser.h
diff options
context:
space:
mode:
Diffstat (limited to 'cpp/include/Slice/Parser.h')
-rw-r--r--cpp/include/Slice/Parser.h1435
1 files changed, 724 insertions, 711 deletions
diff --git a/cpp/include/Slice/Parser.h b/cpp/include/Slice/Parser.h
index 568c05fd288..de7af8f4e6e 100644
--- a/cpp/include/Slice/Parser.h
+++ b/cpp/include/Slice/Parser.h
@@ -1,711 +1,724 @@
-// **********************************************************************
-//
-// Copyright (c) 2001
-// MutableRealms, Inc.
-// Huntsville, AL, USA
-//
-// All Rights Reserved
-//
-// **********************************************************************
-
-#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>
-
-#ifdef _WIN32
-# ifdef SLICE_API_EXPORTS
-# define SLICE_API __declspec(dllexport)
-# else
-# define SLICE_API __declspec(dllimport)
-# endif
-#else
-# define SLICE_API /**/
-#endif
-
-namespace Slice
-{
-
-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 DataMember;
-class Sequence;
-class Dictionary;
-class Enum;
-class Enumerator;
-class Unit;
-
-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<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<Unit> UnitPtr;
-
-}
-
-//
-// Stuff for flex and bison
-//
-
-#define YYSTYPE Slice::GrammarBasePtr
-#define YY_DECL int yylex(YYSTYPE* yylvalp)
-YY_DECL;
-int yyparse();
-
-//
-// I must set the initial stack depth to the maximum stack depth to
-// disable bison stack resizing. The bison stack resizing routines use
-// simple malloc/alloc/memcpy calls, which do not work for the
-// YYSTYPE, since YYSTYPE is a C++ type, with constructor, destructor,
-// assignment operator, etc.
-//
-#define YYMAXDEPTH 20000 // 20000 should suffice. Bison default is 10000 as maximum.
-#define YYINITDEPTH YYMAXDEPTH // Initial depth is set to max depth, for the reasons described above.
-
-//
-// Newer bison versions allow to disable stack resizing by defining
-// yyoverflow.
-//
-#define yyoverflow(a, b, c, d, e, f) yyerror(a)
-
-namespace Slice
-{
-
-typedef std::list<TypePtr> TypeList;
-typedef std::list<ExceptionPtr> ExceptionList;
-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<OperationPtr> OperationList;
-typedef std::list<DataMemberPtr> DataMemberList;
-typedef std::list<EnumeratorPtr> EnumeratorList;
-
-// ----------------------------------------------------------------------
-// ParserVisitor
-// ----------------------------------------------------------------------
-
-class SLICE_API 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 visitDataMember(const DataMemberPtr&) { }
- virtual void visitSequence(const SequencePtr&) { }
- virtual void visitDictionary(const DictionaryPtr&) { }
- virtual void visitEnum(const EnumPtr&) { }
-};
-
-// ----------------------------------------------------------------------
-// GrammarBase
-// ----------------------------------------------------------------------
-
-class SLICE_API GrammarBase : public ::IceUtil::SimpleShared
-{
-};
-
-// ----------------------------------------------------------------------
-// SyntaxTreeBase
-// ----------------------------------------------------------------------
-
-class SLICE_API SyntaxTreeBase : public GrammarBase
-{
-public:
-
- virtual void destroy();
- UnitPtr unit();
- virtual void visit(ParserVisitor*);
-
-protected:
-
- SyntaxTreeBase(const UnitPtr&);
-
- UnitPtr _unit;
-};
-
-// ----------------------------------------------------------------------
-// Type
-// ----------------------------------------------------------------------
-
-class SLICE_API Type : virtual public SyntaxTreeBase
-{
-public:
-
-protected:
-
- Type(const UnitPtr&);
-};
-
-// ----------------------------------------------------------------------
-// Builtin
-// ----------------------------------------------------------------------
-
-class SLICE_API Builtin : virtual public Type
-{
-public:
-
- enum Kind
- {
- KindByte,
- KindBool,
- KindShort,
- KindInt,
- KindLong,
- KindFloat,
- KindDouble,
- KindString,
- KindObject,
- KindObjectProxy,
- KindLocalObject
- };
- Kind kind();
-
-protected:
-
- Builtin(const UnitPtr&, Kind);
- friend class SLICE_API Unit;
-
- Kind _kind;
-};
-
-// ----------------------------------------------------------------------
-// Contained
-// ----------------------------------------------------------------------
-
-class SLICE_API Contained : virtual public SyntaxTreeBase
-{
-public:
-
- ContainerPtr container();
- std::string name();
- std::string scoped();
- std::string scope();
- std::string file();
- std::string comment();
-
- int includeLevel();
- void updateIncludeLevel();
-
- std::list<std::string> getMetaData();
- void setMetaData(const std::list<std::string>&);
-
- enum ContainedType
- {
- ContainedTypeSequence,
- ContainedTypeDictionary,
- ContainedTypeEnum,
- ContainedTypeEnumerator,
- ContainedTypeModule,
- ContainedTypeClass,
- ContainedTypeException,
- ContainedTypeStruct,
- ContainedTypeOperation,
- ContainedTypeDataMember
- };
- virtual ContainedType containedType() = 0;
-
- virtual bool uses(const ContainedPtr&) = 0;
-
- bool operator<(const Contained&) const;
- bool operator==(const Contained&) const;
-
-protected:
-
- Contained(const ContainerPtr&, const std::string&);
- friend class SLICE_API Container;
-
- ContainerPtr _container;
- std::string _name;
- std::string _scoped;
- std::string _file;
- std::string _comment;
- int _includeLevel;
- std::list<std::string> _metaData;
-};
-
-// ----------------------------------------------------------------------
-// Container
-// ----------------------------------------------------------------------
-
-class SLICE_API Container : virtual public SyntaxTreeBase
-{
-public:
-
- virtual void destroy();
- ModulePtr createModule(const std::string&);
- ClassDefPtr createClassDef(const std::string&, bool, const ClassList&, bool);
- ClassDeclPtr createClassDecl(const std::string&, bool, bool);
- ExceptionPtr createException(const std::string&, const ExceptionPtr&, bool);
- StructPtr createStruct(const std::string&, bool);
- SequencePtr createSequence(const std::string&, const TypePtr&, bool);
- DictionaryPtr createDictionary(const std::string&, const TypePtr&, const TypePtr&, bool);
- EnumPtr createEnum(const std::string&, bool);
- EnumeratorPtr createEnumerator(const std::string&);
- TypeList lookupType(const std::string&, bool = true);
- TypeList lookupTypeNoBuiltin(const std::string&, bool = true);
- ContainedList lookupContained(const std::string&, bool = true);
- ExceptionPtr lookupException(const std::string&, bool = true);
- ModuleList modules();
- ClassList classes();
- ExceptionList exceptions();
- StructList structs();
- SequenceList sequences();
- DictionaryList dictionaries();
- EnumList enums();
- bool hasNonLocalClassDecls();
- bool hasClassDecls();
- bool hasClassDefs();
- bool hasOtherConstructedOrExceptions(); // Exceptions or constructed types other than classes.
- std::string thisScope();
- void mergeModules();
- void sort();
- void sortContents();
- virtual void visit(ParserVisitor*);
- void containerRecDependencies(std::set<ConstructedPtr>&); // Internal operation, don't use directly.
-
-protected:
-
- Container(const UnitPtr&);
-
- bool checkInterfaceAndLocal(const std::string&, bool, bool, bool, bool, bool);
-
- ContainedList _contents;
-};
-
-// ----------------------------------------------------------------------
-// Module
-// ----------------------------------------------------------------------
-
-class SLICE_API Module : virtual public Container, virtual public Contained
-{
-public:
-
- virtual ContainedType containedType();
- virtual bool uses(const ContainedPtr&);
- virtual void visit(ParserVisitor*);
-
-protected:
-
- Module(const ContainerPtr&, const std::string&);
- friend class SLICE_API Container;
-};
-
-// ----------------------------------------------------------------------
-// Constructed
-// ----------------------------------------------------------------------
-
-class SLICE_API Constructed : virtual public Type, virtual public Contained
-{
-public:
-
- bool isLocal();
- 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 SLICE_API ClassDecl : virtual public Constructed
-{
-public:
-
- virtual void destroy();
- ClassDefPtr definition();
- bool isInterface();
- virtual ContainedType containedType();
- virtual bool uses(const ContainedPtr&);
- virtual void visit(ParserVisitor*);
- virtual void recDependencies(std::set<ConstructedPtr>&); // Internal operation, don't use directly.
-
-protected:
-
- ClassDecl(const ContainerPtr&, const std::string&, bool, bool);
- friend class SLICE_API Container;
- friend class SLICE_API ClassDef;
-
- ClassDefPtr _definition;
- bool _interface;
-};
-
-// ----------------------------------------------------------------------
-// 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 SLICE_API ClassDef : virtual public Container, virtual public Contained
-{
-public:
-
- virtual void destroy();
- OperationPtr createOperation(const std::string&, const TypePtr&, const TypeStringList&, const TypeStringList&,
- const ExceptionList&);
- DataMemberPtr createDataMember(const std::string&, const TypePtr&);
- ClassDeclPtr declaration();
- ClassList bases();
- ClassList allBases();
- OperationList operations();
- OperationList allOperations();
- DataMemberList dataMembers();
- bool isAbstract();
- bool isInterface();
- bool isLocal();
- bool hasDataMembers();
- virtual ContainedType containedType();
- virtual bool uses(const ContainedPtr&);
- virtual void visit(ParserVisitor*);
-
-protected:
-
- ClassDef(const ContainerPtr&, const std::string&, bool, const ClassList&, bool);
- friend class SLICE_API Container;
-
- ClassDeclPtr _declaration;
- bool _interface;
- bool _hasDataMembers;
- ClassList _bases;
- bool _local;
-};
-
-// ----------------------------------------------------------------------
-// Proxy
-// ----------------------------------------------------------------------
-
-class SLICE_API Proxy : virtual public Type
-{
-public:
-
- ClassDeclPtr _class();
-
- Proxy(const ClassDeclPtr&);
-
-protected:
-
- ClassDeclPtr __class;
-};
-
-// ----------------------------------------------------------------------
-// Exception
-// ----------------------------------------------------------------------
-
-// No inheritance from Constructed, as this is not a Type
-class SLICE_API Exception : virtual public Container, virtual public Contained
-{
-public:
-
- virtual void destroy();
- DataMemberPtr createDataMember(const std::string&, const TypePtr&);
- DataMemberList dataMembers();
- ExceptionPtr base();
- ExceptionList allBases();
- bool isLocal();
- virtual ContainedType containedType();
- virtual bool uses(const ContainedPtr&);
- virtual void visit(ParserVisitor*);
-
-protected:
-
- Exception(const ContainerPtr&, const std::string&, const ExceptionPtr&, bool);
- friend class SLICE_API Container;
-
- ExceptionPtr _base;
- bool _local;
-};
-
-// ----------------------------------------------------------------------
-// Struct
-// ----------------------------------------------------------------------
-
-class SLICE_API Struct : virtual public Container, virtual public Constructed
-{
-public:
-
- DataMemberPtr createDataMember(const std::string&, const TypePtr&);
- DataMemberList dataMembers();
- virtual ContainedType containedType();
- virtual bool uses(const ContainedPtr&);
- virtual void visit(ParserVisitor*);
- virtual void recDependencies(std::set<ConstructedPtr>&); // Internal operation, don't use directly.
-
-protected:
-
- Struct(const ContainerPtr&, const std::string&, bool);
- friend class SLICE_API Container;
-};
-
-// ----------------------------------------------------------------------
-// Sequence
-// ----------------------------------------------------------------------
-
-class SLICE_API Sequence : virtual public Constructed
-{
-public:
-
- TypePtr type();
- virtual ContainedType containedType();
- virtual bool uses(const ContainedPtr&);
- virtual void visit(ParserVisitor*);
- virtual void recDependencies(std::set<ConstructedPtr>&); // Internal operation, don't use directly.
-
-protected:
-
- Sequence(const ContainerPtr&, const std::string&, const TypePtr&, bool);
- friend class SLICE_API Container;
-
- TypePtr _type;
-};
-
-// ----------------------------------------------------------------------
-// Dictionary
-// ----------------------------------------------------------------------
-
-class SLICE_API Dictionary : virtual public Constructed
-{
-public:
-
- TypePtr keyType();
- TypePtr valueType();
- virtual ContainedType containedType();
- virtual bool uses(const ContainedPtr&);
- virtual void visit(ParserVisitor*);
- virtual void recDependencies(std::set<ConstructedPtr>&); // Internal operation, don't use directly.
-
-protected:
-
- Dictionary(const ContainerPtr&, const std::string&, const TypePtr&, const TypePtr&, bool);
- friend class SLICE_API Container;
-
- TypePtr _keyType;
- TypePtr _valueType;
-};
-
-// ----------------------------------------------------------------------
-// Enum
-// ----------------------------------------------------------------------
-
-class SLICE_API Enum : virtual public Constructed
-{
-public:
-
- EnumeratorList getEnumerators();
- void setEnumerators(const EnumeratorList&);
- virtual ContainedType containedType();
- virtual bool uses(const ContainedPtr&);
- virtual void visit(ParserVisitor*);
- virtual void recDependencies(std::set<ConstructedPtr>&); // Internal operation, don't use directly.
-
-protected:
-
- Enum(const ContainerPtr&, const std::string&, bool);
- friend class SLICE_API Container;
-
- EnumeratorList _enumerators;
-};
-
-// ----------------------------------------------------------------------
-// Enumerator
-// ----------------------------------------------------------------------
-
-class SLICE_API Enumerator : virtual public Contained
-{
-public:
-
- virtual bool uses(const ContainedPtr&);
- virtual ContainedType containedType();
-
-protected:
-
- Enumerator(const ContainerPtr&, const std::string&);
- friend class SLICE_API Container;
-};
-
-// ----------------------------------------------------------------------
-// Operation
-// ----------------------------------------------------------------------
-
-class SLICE_API Operation : virtual public Contained
-{
-public:
-
- TypePtr returnType();
- TypeStringList inputParameters();
- TypeStringList outputParameters();
- ExceptionList throws();
- virtual ContainedType containedType();
- virtual bool uses(const ContainedPtr&);
- virtual void visit(ParserVisitor*);
-
-protected:
-
- Operation(const ContainerPtr&, const std::string&, const TypePtr&, const TypeStringList&, const TypeStringList&,
- const ExceptionList&);
- friend class SLICE_API ClassDef;
-
- TypePtr _returnType;
- TypeStringList _inParams;
- TypeStringList _outParams;
- ExceptionList _throws;
-};
-
-// ----------------------------------------------------------------------
-// DataMember
-// ----------------------------------------------------------------------
-
-class SLICE_API DataMember : virtual public Contained
-{
-public:
-
- TypePtr type();
- virtual ContainedType containedType();
- virtual bool uses(const ContainedPtr&);
- virtual void visit(ParserVisitor*);
-
-protected:
-
- DataMember(const ContainerPtr&, const std::string&, const TypePtr&);
- friend class SLICE_API ClassDef;
- friend class SLICE_API Struct;
- friend class SLICE_API Exception;
-
- TypePtr _type;
-};
-
-// ----------------------------------------------------------------------
-// Unit
-// ----------------------------------------------------------------------
-
-class SLICE_API Unit : virtual public Container
-{
-public:
-
- static UnitPtr createUnit(bool, bool);
-
- bool ignRedefs();
-
- void setComment(const std::string&);
- std::string currentComment();
- std::string currentFile();
-
- void nextLine();
- void scanPosition(const char*);
- int currentIncludeLevel();
-
- void error(const char*);
- void error(const std::string&);
-
- void warning(const char*);
- void warning(const std::string&);
-
- ContainerPtr currentContainer();
- void pushContainer(const ContainerPtr&);
- void popContainer();
-
- void addContent(const ContainedPtr&);
- void removeContent(const ContainedPtr&);
- ContainedList findContents(const std::string&);
- ClassList findDerivedClasses(const ClassDefPtr&);
- ExceptionList findDerivedExceptions(const ExceptionPtr&);
- ContainedList findUsedBy(const ContainedPtr&);
-
- bool usesProxies();
- bool usesNonLocals();
-
- StringList includeFiles();
-
- int parse(FILE*, bool);
-
- virtual void destroy();
- virtual void visit(ParserVisitor*);
-
- BuiltinPtr builtin(Builtin::Kind);
-
-private:
-
- Unit(bool, bool);
-
- bool _ignRedefs;
- bool _all;
- int _errors;
- std::string _currentComment;
- int _currentLine;
- int _currentIncludeLevel;
- std::string _currentFile;
- std::string _topLevelFile;
- StringList _includeFiles;
- std::stack<ContainerPtr> _containerStack;
- std::map<Builtin::Kind, BuiltinPtr> _builtins;
- std::map<std::string, ContainedList > _contentMap;
-};
-
-extern SLICE_API Unit* unit; // The current parser for bison/flex
-
-}
-
-#endif
+// **********************************************************************
+//
+// Copyright (c) 2001
+// MutableRealms, Inc.
+// Huntsville, AL, USA
+//
+// All Rights Reserved
+//
+// **********************************************************************
+
+#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>
+
+#ifdef _WIN32
+# ifdef SLICE_API_EXPORTS
+# define SLICE_API __declspec(dllexport)
+# else
+# define SLICE_API __declspec(dllimport)
+# endif
+#else
+# define SLICE_API /**/
+#endif
+
+namespace Slice
+{
+
+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 DataMember;
+class Sequence;
+class Dictionary;
+class Enum;
+class Enumerator;
+class Unit;
+
+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<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<Unit> UnitPtr;
+
+}
+
+//
+// Stuff for flex and bison
+//
+
+#define YYSTYPE Slice::GrammarBasePtr
+#define YY_DECL int yylex(YYSTYPE* yylvalp)
+YY_DECL;
+int yyparse();
+
+//
+// I must set the initial stack depth to the maximum stack depth to
+// disable bison stack resizing. The bison stack resizing routines use
+// simple malloc/alloc/memcpy calls, which do not work for the
+// YYSTYPE, since YYSTYPE is a C++ type, with constructor, destructor,
+// assignment operator, etc.
+//
+#define YYMAXDEPTH 20000 // 20000 should suffice. Bison default is 10000 as maximum.
+#define YYINITDEPTH YYMAXDEPTH // Initial depth is set to max depth, for the reasons described above.
+
+//
+// Newer bison versions allow to disable stack resizing by defining
+// yyoverflow.
+//
+#define yyoverflow(a, b, c, d, e, f) yyerror(a)
+
+namespace Slice
+{
+
+typedef std::list<TypePtr> TypeList;
+typedef std::list<ExceptionPtr> ExceptionList;
+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<ClassList> GraphPartitionList;
+typedef std::set<std::string> StringSet;
+typedef std::list<StringSet> StringSetList;
+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<OperationPtr> OperationList;
+typedef std::list<DataMemberPtr> DataMemberList;
+typedef std::list<EnumeratorPtr> EnumeratorList;
+
+// ----------------------------------------------------------------------
+// ParserVisitor
+// ----------------------------------------------------------------------
+
+class SLICE_API 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 visitDataMember(const DataMemberPtr&) { }
+ virtual void visitSequence(const SequencePtr&) { }
+ virtual void visitDictionary(const DictionaryPtr&) { }
+ virtual void visitEnum(const EnumPtr&) { }
+};
+
+// ----------------------------------------------------------------------
+// GrammarBase
+// ----------------------------------------------------------------------
+
+class SLICE_API GrammarBase : public ::IceUtil::SimpleShared
+{
+};
+
+// ----------------------------------------------------------------------
+// SyntaxTreeBase
+// ----------------------------------------------------------------------
+
+class SLICE_API SyntaxTreeBase : public GrammarBase
+{
+public:
+
+ virtual void destroy();
+ UnitPtr unit();
+ virtual void visit(ParserVisitor*);
+
+protected:
+
+ SyntaxTreeBase(const UnitPtr&);
+
+ UnitPtr _unit;
+};
+
+// ----------------------------------------------------------------------
+// Type
+// ----------------------------------------------------------------------
+
+class SLICE_API Type : virtual public SyntaxTreeBase
+{
+public:
+
+protected:
+
+ Type(const UnitPtr&);
+};
+
+// ----------------------------------------------------------------------
+// Builtin
+// ----------------------------------------------------------------------
+
+class SLICE_API Builtin : virtual public Type
+{
+public:
+
+ enum Kind
+ {
+ KindByte,
+ KindBool,
+ KindShort,
+ KindInt,
+ KindLong,
+ KindFloat,
+ KindDouble,
+ KindString,
+ KindObject,
+ KindObjectProxy,
+ KindLocalObject
+ };
+ Kind kind();
+
+protected:
+
+ Builtin(const UnitPtr&, Kind);
+ friend class SLICE_API Unit;
+
+ Kind _kind;
+};
+
+// ----------------------------------------------------------------------
+// Contained
+// ----------------------------------------------------------------------
+
+class SLICE_API Contained : virtual public SyntaxTreeBase
+{
+public:
+
+ ContainerPtr container();
+ std::string name();
+ std::string scoped();
+ std::string scope();
+ std::string file();
+ std::string comment();
+
+ int includeLevel();
+ void updateIncludeLevel();
+
+ std::list<std::string> getMetaData();
+ void setMetaData(const std::list<std::string>&);
+
+ enum ContainedType
+ {
+ ContainedTypeSequence,
+ ContainedTypeDictionary,
+ ContainedTypeEnum,
+ ContainedTypeEnumerator,
+ ContainedTypeModule,
+ ContainedTypeClass,
+ ContainedTypeException,
+ ContainedTypeStruct,
+ ContainedTypeOperation,
+ ContainedTypeDataMember
+ };
+ virtual ContainedType containedType() = 0;
+
+ virtual bool uses(const ContainedPtr&) = 0;
+
+ bool operator<(const Contained&) const;
+ bool operator==(const Contained&) const;
+
+protected:
+
+ Contained(const ContainerPtr&, const std::string&);
+ friend class SLICE_API Container;
+
+ ContainerPtr _container;
+ std::string _name;
+ std::string _scoped;
+ std::string _file;
+ std::string _comment;
+ int _includeLevel;
+ std::list<std::string> _metaData;
+};
+
+// ----------------------------------------------------------------------
+// Container
+// ----------------------------------------------------------------------
+
+class SLICE_API Container : virtual public SyntaxTreeBase
+{
+public:
+
+ virtual void destroy();
+ ModulePtr createModule(const std::string&);
+ ClassDefPtr createClassDef(const std::string&, bool, const ClassList&, bool);
+ ClassDeclPtr createClassDecl(const std::string&, bool, bool);
+ ExceptionPtr createException(const std::string&, const ExceptionPtr&, bool);
+ StructPtr createStruct(const std::string&, bool);
+ SequencePtr createSequence(const std::string&, const TypePtr&, bool);
+ DictionaryPtr createDictionary(const std::string&, const TypePtr&, const TypePtr&, bool);
+ EnumPtr createEnum(const std::string&, bool);
+ EnumeratorPtr createEnumerator(const std::string&);
+ TypeList lookupType(const std::string&, bool = true);
+ TypeList lookupTypeNoBuiltin(const std::string&, bool = true);
+ ContainedList lookupContained(const std::string&, bool = true);
+ ExceptionPtr lookupException(const std::string&, bool = true);
+ ModuleList modules();
+ ClassList classes();
+ ExceptionList exceptions();
+ StructList structs();
+ SequenceList sequences();
+ DictionaryList dictionaries();
+ EnumList enums();
+ bool hasNonLocalClassDecls();
+ bool hasClassDecls();
+ bool hasClassDefs();
+ bool hasOtherConstructedOrExceptions(); // Exceptions or constructed types other than classes.
+ std::string thisScope();
+ void mergeModules();
+ void sort();
+ void sortContents();
+ virtual void visit(ParserVisitor*);
+ void containerRecDependencies(std::set<ConstructedPtr>&); // Internal operation, don't use directly.
+
+protected:
+
+ Container(const UnitPtr&);
+
+ bool checkInterfaceAndLocal(const std::string&, bool, bool, bool, bool, bool);
+
+ ContainedList _contents;
+
+private:
+
+ bool isInList(const GraphPartitionList&, const ClassDefPtr) const;
+ void addPartition(GraphPartitionList&,
+ GraphPartitionList::reverse_iterator,
+ const ClassDefPtr) const;
+ StringSetList toStringSetList(const GraphPartitionList&) const;
+ StringList unionOfAllPairIntersections(const StringSetList&) const;
+};
+
+// ----------------------------------------------------------------------
+// Module
+// ----------------------------------------------------------------------
+
+class SLICE_API Module : virtual public Container, virtual public Contained
+{
+public:
+
+ virtual ContainedType containedType();
+ virtual bool uses(const ContainedPtr&);
+ virtual void visit(ParserVisitor*);
+
+protected:
+
+ Module(const ContainerPtr&, const std::string&);
+ friend class SLICE_API Container;
+};
+
+// ----------------------------------------------------------------------
+// Constructed
+// ----------------------------------------------------------------------
+
+class SLICE_API Constructed : virtual public Type, virtual public Contained
+{
+public:
+
+ bool isLocal();
+ 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 SLICE_API ClassDecl : virtual public Constructed
+{
+public:
+
+ virtual void destroy();
+ ClassDefPtr definition();
+ bool isInterface();
+ virtual ContainedType containedType();
+ virtual bool uses(const ContainedPtr&);
+ virtual void visit(ParserVisitor*);
+ virtual void recDependencies(std::set<ConstructedPtr>&); // Internal operation, don't use directly.
+
+protected:
+
+ ClassDecl(const ContainerPtr&, const std::string&, bool, bool);
+ friend class SLICE_API Container;
+ friend class SLICE_API ClassDef;
+
+ ClassDefPtr _definition;
+ bool _interface;
+};
+
+// ----------------------------------------------------------------------
+// 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 SLICE_API ClassDef : virtual public Container, virtual public Contained
+{
+public:
+
+ virtual void destroy();
+ OperationPtr createOperation(const std::string&, const TypePtr&, const TypeStringList&, const TypeStringList&,
+ const ExceptionList&);
+ DataMemberPtr createDataMember(const std::string&, const TypePtr&);
+ ClassDeclPtr declaration();
+ ClassList bases();
+ ClassList allBases();
+ OperationList operations();
+ OperationList allOperations();
+ DataMemberList dataMembers();
+ DataMemberList allDataMembers();
+ bool isAbstract();
+ bool isInterface();
+ bool isLocal();
+ bool hasDataMembers();
+ virtual ContainedType containedType();
+ virtual bool uses(const ContainedPtr&);
+ virtual void visit(ParserVisitor*);
+
+protected:
+
+ ClassDef(const ContainerPtr&, const std::string&, bool, const ClassList&, bool);
+ friend class SLICE_API Container;
+
+ ClassDeclPtr _declaration;
+ bool _interface;
+ bool _hasDataMembers;
+ ClassList _bases;
+ bool _local;
+};
+
+// ----------------------------------------------------------------------
+// Proxy
+// ----------------------------------------------------------------------
+
+class SLICE_API Proxy : virtual public Type
+{
+public:
+
+ ClassDeclPtr _class();
+
+ Proxy(const ClassDeclPtr&);
+
+protected:
+
+ ClassDeclPtr __class;
+};
+
+// ----------------------------------------------------------------------
+// Exception
+// ----------------------------------------------------------------------
+
+// No inheritance from Constructed, as this is not a Type
+class SLICE_API Exception : virtual public Container, virtual public Contained
+{
+public:
+
+ virtual void destroy();
+ DataMemberPtr createDataMember(const std::string&, const TypePtr&);
+ DataMemberList dataMembers();
+ ExceptionPtr base();
+ ExceptionList allBases();
+ bool isLocal();
+ virtual ContainedType containedType();
+ virtual bool uses(const ContainedPtr&);
+ virtual void visit(ParserVisitor*);
+
+protected:
+
+ Exception(const ContainerPtr&, const std::string&, const ExceptionPtr&, bool);
+ friend class SLICE_API Container;
+
+ ExceptionPtr _base;
+ bool _local;
+};
+
+// ----------------------------------------------------------------------
+// Struct
+// ----------------------------------------------------------------------
+
+class SLICE_API Struct : virtual public Container, virtual public Constructed
+{
+public:
+
+ DataMemberPtr createDataMember(const std::string&, const TypePtr&);
+ DataMemberList dataMembers();
+ virtual ContainedType containedType();
+ virtual bool uses(const ContainedPtr&);
+ virtual void visit(ParserVisitor*);
+ virtual void recDependencies(std::set<ConstructedPtr>&); // Internal operation, don't use directly.
+
+protected:
+
+ Struct(const ContainerPtr&, const std::string&, bool);
+ friend class SLICE_API Container;
+};
+
+// ----------------------------------------------------------------------
+// Sequence
+// ----------------------------------------------------------------------
+
+class SLICE_API Sequence : virtual public Constructed
+{
+public:
+
+ TypePtr type();
+ virtual ContainedType containedType();
+ virtual bool uses(const ContainedPtr&);
+ virtual void visit(ParserVisitor*);
+ virtual void recDependencies(std::set<ConstructedPtr>&); // Internal operation, don't use directly.
+
+protected:
+
+ Sequence(const ContainerPtr&, const std::string&, const TypePtr&, bool);
+ friend class SLICE_API Container;
+
+ TypePtr _type;
+};
+
+// ----------------------------------------------------------------------
+// Dictionary
+// ----------------------------------------------------------------------
+
+class SLICE_API Dictionary : virtual public Constructed
+{
+public:
+
+ TypePtr keyType();
+ TypePtr valueType();
+ virtual ContainedType containedType();
+ virtual bool uses(const ContainedPtr&);
+ virtual void visit(ParserVisitor*);
+ virtual void recDependencies(std::set<ConstructedPtr>&); // Internal operation, don't use directly.
+
+protected:
+
+ Dictionary(const ContainerPtr&, const std::string&, const TypePtr&, const TypePtr&, bool);
+ friend class SLICE_API Container;
+
+ TypePtr _keyType;
+ TypePtr _valueType;
+};
+
+// ----------------------------------------------------------------------
+// Enum
+// ----------------------------------------------------------------------
+
+class SLICE_API Enum : virtual public Constructed
+{
+public:
+
+ EnumeratorList getEnumerators();
+ void setEnumerators(const EnumeratorList&);
+ virtual ContainedType containedType();
+ virtual bool uses(const ContainedPtr&);
+ virtual void visit(ParserVisitor*);
+ virtual void recDependencies(std::set<ConstructedPtr>&); // Internal operation, don't use directly.
+
+protected:
+
+ Enum(const ContainerPtr&, const std::string&, bool);
+ friend class SLICE_API Container;
+
+ EnumeratorList _enumerators;
+};
+
+// ----------------------------------------------------------------------
+// Enumerator
+// ----------------------------------------------------------------------
+
+class SLICE_API Enumerator : virtual public Contained
+{
+public:
+
+ virtual bool uses(const ContainedPtr&);
+ virtual ContainedType containedType();
+
+protected:
+
+ Enumerator(const ContainerPtr&, const std::string&);
+ friend class SLICE_API Container;
+};
+
+// ----------------------------------------------------------------------
+// Operation
+// ----------------------------------------------------------------------
+
+class SLICE_API Operation : virtual public Contained
+{
+public:
+
+ TypePtr returnType();
+ TypeStringList inputParameters();
+ TypeStringList outputParameters();
+ ExceptionList throws();
+ virtual ContainedType containedType();
+ virtual bool uses(const ContainedPtr&);
+ virtual void visit(ParserVisitor*);
+
+protected:
+
+ Operation(const ContainerPtr&, const std::string&, const TypePtr&, const TypeStringList&, const TypeStringList&,
+ const ExceptionList&);
+ friend class SLICE_API ClassDef;
+
+ TypePtr _returnType;
+ TypeStringList _inParams;
+ TypeStringList _outParams;
+ ExceptionList _throws;
+};
+
+// ----------------------------------------------------------------------
+// DataMember
+// ----------------------------------------------------------------------
+
+class SLICE_API DataMember : virtual public Contained
+{
+public:
+
+ TypePtr type();
+ virtual ContainedType containedType();
+ virtual bool uses(const ContainedPtr&);
+ virtual void visit(ParserVisitor*);
+
+protected:
+
+ DataMember(const ContainerPtr&, const std::string&, const TypePtr&);
+ friend class SLICE_API ClassDef;
+ friend class SLICE_API Struct;
+ friend class SLICE_API Exception;
+
+ TypePtr _type;
+};
+
+// ----------------------------------------------------------------------
+// Unit
+// ----------------------------------------------------------------------
+
+class SLICE_API Unit : virtual public Container
+{
+public:
+
+ static UnitPtr createUnit(bool, bool);
+
+ bool ignRedefs();
+
+ void setComment(const std::string&);
+ std::string currentComment();
+ std::string currentFile();
+
+ void nextLine();
+ void scanPosition(const char*);
+ int currentIncludeLevel();
+
+ void error(const char*);
+ void error(const std::string&);
+
+ void warning(const char*);
+ void warning(const std::string&);
+
+ ContainerPtr currentContainer();
+ void pushContainer(const ContainerPtr&);
+ void popContainer();
+
+ void addContent(const ContainedPtr&);
+ void removeContent(const ContainedPtr&);
+ ContainedList findContents(const std::string&);
+ ClassList findDerivedClasses(const ClassDefPtr&);
+ ExceptionList findDerivedExceptions(const ExceptionPtr&);
+ ContainedList findUsedBy(const ContainedPtr&);
+
+ bool usesProxies();
+ bool usesNonLocals();
+
+ StringList includeFiles();
+
+ int parse(FILE*, bool);
+
+ virtual void destroy();
+ virtual void visit(ParserVisitor*);
+
+ BuiltinPtr builtin(Builtin::Kind);
+
+private:
+
+ Unit(bool, bool);
+
+ bool _ignRedefs;
+ bool _all;
+ int _errors;
+ std::string _currentComment;
+ int _currentLine;
+ int _currentIncludeLevel;
+ std::string _currentFile;
+ std::string _topLevelFile;
+ StringList _includeFiles;
+ std::stack<ContainerPtr> _containerStack;
+ std::map<Builtin::Kind, BuiltinPtr> _builtins;
+ std::map<std::string, ContainedList > _contentMap;
+};
+
+extern SLICE_API Unit* unit; // The current parser for bison/flex
+
+}
+
+#endif