Modules | Files | Inheritance Tree | Inheritance Graph | Name Index | Config
File: Synopsis/Parser/C++/occ/walker.h
    1| /*
    2|   Copyright (C) 1997-2000 Shigeru Chiba, University of Tsukuba.
    3| 
    4|   Permission to use, copy, distribute and modify this software and   
    5|   its documentation for any purpose is hereby granted without fee,        
    6|   provided that the above copyright notice appear in all copies and that 
    7|   both that copyright notice and this permission notice appear in 
    8|   supporting documentation.
    9| 
   10|   Shigeru Chiba makes no representations about the suitability of this 
   11|   software for any purpose.  It is provided "as is" without express or
   12|   implied warranty.
   13| */
   14| 
   15| #ifndef _walker_h
   16| #define _walker_h
   17| 
   18| #include "types.h"
   19| 
   20| class Environment;
   21| class TypeInfo;
   22| class Class;
   23| class Parser;
   24| class Ptree;
   25| class PtreeDeclarator;
   26| 
   27| class Walker : public LightObject {
   28| public:
   29|     Walker(Parser*);
   30|     Walker(Parser*, Environment*);
   31|     Walker(Environment*);
   32|     Walker(Walker*);
   33| 
   34|     Ptree* Translate(Ptree*);
   35|     void Typeof(Ptree*, TypeInfo&);
   36| 
   37|     virtual bool IsClassWalker();
   38| 
   39|     // default translation
   40|     virtual Ptree* TranslatePtree(Ptree*);
   41|     virtual void TypeofPtree(Ptree*, TypeInfo&);
   42| 
   43|     virtual Ptree* TranslateTypedef(Ptree*);
   44|     virtual Ptree* TranslateTemplateDecl(Ptree*);
   45|     virtual Ptree* TranslateTemplateInstantiation(Ptree*);
   46|     virtual Ptree* TranslateTemplateInstantiation(Ptree*, Ptree*,
   47|                       Ptree*, Class*);
   48|     virtual Class* MakeTemplateInstantiationMetaobject(
   49|         Ptree* full_class_spec, Ptree* userkey, Ptree* class_spec);
   50|     virtual Ptree* TranslateExternTemplate(Ptree*);
   51|     virtual Ptree* TranslateTemplateClass(Ptree*, Ptree*);
   52|     virtual Class* MakeTemplateClassMetaobject(Ptree*, Ptree*, Ptree*);
   53|     virtual Ptree* TranslateTemplateFunction(Ptree*, Ptree*);
   54|     virtual Ptree* TranslateMetaclassDecl(Ptree*);
   55|     virtual Ptree* TranslateLinkageSpec(Ptree*);
   56|     virtual Ptree* TranslateNamespaceSpec(Ptree*);
   57|     virtual Ptree* TranslateUsing(Ptree*);
   58|     virtual Ptree* TranslateDeclaration(Ptree*);
   59|     virtual Ptree* TranslateStorageSpecifiers(Ptree*);
   60|     virtual Ptree* TranslateDeclarators(Ptree*);
   61|     virtual Ptree* TranslateDeclarator(bool, PtreeDeclarator*);
   62|     static bool GetArgDeclList(PtreeDeclarator*, Ptree*&);
   63|     virtual Ptree* TranslateArgDeclList(bool, Ptree*, Ptree*);
   64|     static Ptree* TranslateArgDeclList2(bool, Environment*, boolboolint,
   65|                Ptree*);
   66|     static Ptree* FillArgumentName(Ptree*, Ptree*, int arg_name);
   67|     virtual Ptree* TranslateInitializeArgs(PtreeDeclarator*, Ptree*);
   68|     virtual Ptree* TranslateAssignInitializer(PtreeDeclarator*, Ptree*);
   69|     virtual Ptree* TranslateFunctionImplementation(Ptree*);
   70|     virtual Ptree* RecordArgsAndTranslateFbody(Class*, Ptree* args,
   71|                       Ptree* body);
   72|     virtual Ptree* TranslateFunctionBody(Ptree*);
   73|     virtual Ptree* TranslateBrace(Ptree*);
   74|     virtual Ptree* TranslateBlock(Ptree*);
   75|     virtual Ptree* TranslateClassBody(Ptree*, Ptree*, Class*);
   76| 
   77|     virtual Ptree* TranslateClassSpec(Ptree*);
   78|     virtual Class* MakeClassMetaobject(Ptree*, Ptree*, Ptree*);
   79|     virtual Ptree* TranslateClassSpec(Ptree*, Ptree*, Ptree*, Class*);
   80|     virtual Ptree* TranslateEnumSpec(Ptree*);
   81| 
   82|     virtual Ptree* TranslateAccessSpec(Ptree*);
   83|     virtual Ptree* TranslateAccessDecl(Ptree*);
   84|     virtual Ptree* TranslateUserAccessSpec(Ptree*);
   85| 
   86|     virtual Ptree* TranslateIf(Ptree*);
   87|     virtual Ptree* TranslateSwitch(Ptree*);
   88|     virtual Ptree* TranslateWhile(Ptree*);
   89|     virtual Ptree* TranslateDo(Ptree*);
   90|     virtual Ptree* TranslateFor(Ptree*);
   91|     virtual Ptree* TranslateTry(Ptree*);
   92|     virtual Ptree* TranslateBreak(Ptree*);
   93|     virtual Ptree* TranslateContinue(Ptree*);
   94|     virtual Ptree* TranslateReturn(Ptree*);
   95|     virtual Ptree* TranslateGoto(Ptree*);
   96|     virtual Ptree* TranslateCase(Ptree*);
   97|     virtual Ptree* TranslateDefault(Ptree*);
   98|     virtual Ptree* TranslateLabel(Ptree*);
   99|     virtual Ptree* TranslateExprStatement(Ptree*);
  100| 
  101|     virtual Ptree* TranslateTypespecifier(Ptree*);
  102| 
  103|     virtual Ptree* TranslateComma(Ptree*);
  104|     virtual Ptree* TranslateAssign(Ptree*);
  105|     virtual Ptree* TranslateCond(Ptree*);
  106|     virtual Ptree* TranslateInfix(Ptree*);
  107|     virtual Ptree* TranslatePm(Ptree*);
  108|     virtual Ptree* TranslateCast(Ptree*);
  109|     virtual Ptree* TranslateUnary(Ptree*);
  110|     virtual Ptree* TranslateThrow(Ptree*);
  111|     virtual Ptree* TranslateSizeof(Ptree*);
  112|     virtual Ptree* TranslateTypeid(Ptree*);
  113|     virtual Ptree* TranslateTypeof(Ptree*);
  114|     virtual Ptree* TranslateNew(Ptree*);
  115|     virtual Ptree* TranslateNew2(Ptree*, Ptree*, Ptree*, Ptree*,
  116|                              Ptree*, Ptree*, Ptree*);
  117|     virtual Ptree* TranslateNew3(Ptree* type);
  118|     virtual Ptree* TranslateDelete(Ptree*);
  119|     virtual Ptree* TranslateThis(Ptree*);
  120|     virtual Ptree* TranslateVariable(Ptree*);
  121|     virtual Ptree* TranslateFstyleCast(Ptree*);
  122|     virtual Ptree* TranslateArray(Ptree*);
  123|     virtual Ptree* TranslateFuncall(Ptree*);    // and fstyle cast
  124|     virtual Ptree* TranslatePostfix(Ptree*);
  125|     virtual Ptree* TranslateUserStatement(Ptree*);
  126|     virtual Ptree* TranslateDotMember(Ptree*);
  127|     virtual Ptree* TranslateArrowMember(Ptree*);
  128|     virtual Ptree* TranslateParen(Ptree*);
  129|     virtual Ptree* TranslateStaticUserStatement(Ptree*);
  130| 
  131|     virtual void TypeofComma(Ptree*, TypeInfo&);
  132|     virtual void TypeofAssign(Ptree*, TypeInfo&);
  133|     virtual void TypeofCond(Ptree*, TypeInfo&);
  134|     virtual void TypeofInfix(Ptree*, TypeInfo&);
  135|     virtual void TypeofPm(Ptree*, TypeInfo&);
  136|     virtual void TypeofCast(Ptree*, TypeInfo&);
  137|     virtual void TypeofUnary(Ptree*, TypeInfo&);
  138|     virtual void TypeofThrow(Ptree*, TypeInfo&);
  139|     virtual void TypeofSizeof(Ptree*, TypeInfo&);
  140|     virtual void TypeofTypeid(Ptree*, TypeInfo&);
  141|     virtual void TypeofTypeof(Ptree*, TypeInfo&);
  142|     virtual void TypeofNew(Ptree*, TypeInfo&);
  143|     virtual void TypeofDelete(Ptree*, TypeInfo&);
  144|     virtual void TypeofThis(Ptree*, TypeInfo&);
  145|     virtual void TypeofVariable(Ptree*, TypeInfo&);
  146|     virtual void TypeofFstyleCast(Ptree*, TypeInfo&);
  147|     virtual void TypeofArray(Ptree*, TypeInfo&);
  148|     virtual void TypeofFuncall(Ptree*, TypeInfo&);      // and fstyle cast
  149|     virtual void TypeofPostfix(Ptree*, TypeInfo&);
  150|     virtual void TypeofUserStatement(Ptree*, TypeInfo&);
  151|     virtual void TypeofDotMember(Ptree*, TypeInfo&);
  152|     virtual void TypeofArrowMember(Ptree*, TypeInfo&);
  153|     virtual void TypeofParen(Ptree*, TypeInfo&);
  154|     virtual void TypeofStaticUserStatement(Ptree*, TypeInfo&);
  155| 
  156| public:
  157|     struct NameScope {
  158|         Environment* env;
  159|         Walkerwalker;
  160|     };
  161| 
  162|     void NewScope();
  163|     void NewScope(Class*);
  164|     Environment* ExitScope();
  165|     void RecordBaseclassEnv(Ptree*);
  166|     NameScope ChangeScope(Environment*);
  167|     void RestoreScope(NameScope&);
  168| 
  169| protected:
  170|     Ptree* TranslateDeclarators(Ptree*, bool);
  171|     Class* LookupMetaclass(Ptree*, Ptree*, Ptree*, bool);
  172| 
  173| private:
  174|     Class* LookupBaseMetaclass(Ptree*, Ptree*, bool);
  175| 
  176| public:
  177|     Ptree* TranslateNewDeclarator(Ptree* decl);
  178|     Ptree* TranslateNewDeclarator2(Ptree* decl);
  179|     Ptree* TranslateArguments(Ptree*);
  180|     static Ptree* GetClassOrEnumSpec(Ptree*);
  181|     static Ptree* GetClassTemplateSpec(Ptree*);
  182|     static Ptree* StripCvFromIntegralType(Ptree*);
  183|     static void SetDeclaratorComments(Ptree*, Ptree*);
  184|     static Ptree* FindLeftLeaf(Ptree* node, Ptree*& parent);
  185|     static void SetLeafComments(Ptree*, Ptree*);
  186|     static Ptree* NthDeclarator(Ptree*, int&);
  187|     static Ptree* FindDeclarator(Ptree*, char*, intchar*, int&,
  188|                       Environment*);
  189|     static bool MatchedDeclarator(Ptree*, char*, intchar*, Environment*);
  190|     static bool WhichDeclarator(Ptree*, Ptree*, int&, Environment*);
  191| 
  192|     void ErrorMessage(char*, Ptree*, Ptree*);
  193|     void WarningMessage(char*, Ptree*, Ptree*);
  194| 
  195|     static void InaccurateErrorMessage(char*, Ptree*, Ptree*);
  196|     static void InaccurateWarningMessage(char*, Ptree*, Ptree*);
  197| 
  198|     static void ChangeDefaultMetaclass(char*);
  199| 
  200| public:
  201|     Parser* GetParser() { return parser; }
  202| 
  203| protected:
  204|     Environment* env;
  205|     Parser* parser;
  206| 
  207| public:
  208|     static charargument_name;
  209| 
  210| private:
  211|     static Parser* default_parser;
  212|     static chardefault_metaclass;
  213| };
  214| 
  215| #endif /* _walker_h */