environ.cpp 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. #include "std.h"
  2. #include "environ.h"
  3. Environ::Environ( const string &f,Type *r,int l,Environ *gs )
  4. :funcLabel(f),returnType(r),level(l),globals(gs){
  5. decls=d_new DeclSeq();
  6. typeDecls=d_new DeclSeq();
  7. funcDecls=d_new DeclSeq();
  8. if( globals ) globals->children.push_back( this );
  9. }
  10. Environ::~Environ(){
  11. if( globals ) globals->children.remove( this );
  12. while( children.size() ) delete children.back();
  13. for( ;labels.size();labels.pop_back() ) delete labels.back();
  14. //delete all types
  15. delete decls;
  16. delete funcDecls;
  17. delete typeDecls;
  18. for( int k=0;k<types.size();++k ) delete types[k];
  19. }
  20. Decl *Environ::findDecl( const string &s ){
  21. for( Environ *e=this;e;e=e->globals ){
  22. if( Decl *d=e->decls->findDecl( s ) ){
  23. if( d->kind&(DECL_LOCAL|DECL_PARAM) ){
  24. if( e==this ) return d;
  25. }else return d;
  26. }
  27. }
  28. return 0;
  29. }
  30. Decl *Environ::findFunc( const string &s ){
  31. for( Environ *e=this;e;e=e->globals ){
  32. if( Decl *d=e->funcDecls->findDecl( s ) ) return d;
  33. }
  34. return 0;
  35. }
  36. Type *Environ::findType( const string &s ){
  37. if( s=="%" ) return Type::int_type;
  38. if( s=="#" ) return Type::float_type;
  39. if( s=="$" ) return Type::string_type;
  40. for( Environ *e=this;e;e=e->globals ){
  41. if( Decl *d=e->typeDecls->findDecl( s ) ) return d->type->structType();
  42. }
  43. return 0;
  44. }
  45. Label *Environ::findLabel( const string &s ){
  46. for( int k=0;k<labels.size();++k ) if( labels[k]->name==s ) return labels[k];
  47. return 0;
  48. }
  49. Label *Environ::insertLabel( const string &s,int def,int src,int sz ){
  50. Label *l=d_new Label( s,def,src,sz );
  51. labels.push_back( l );return l;
  52. }
  53. string Environ::setBreak( const string &s ){
  54. string t=breakLabel;
  55. breakLabel=s;return t;
  56. }