/****
* absyn.h
* Andy Hammerlindl 2002/07/14
*
* Defines the basic types of abstract syntax objects using forward
* class declarations.
*****/

#ifndef ABSYN_H
#define ABSYN_H

#include "common.h"
#include "symbolmaps.h"
#include "errormsg.h" // For position

// Forward declaration for markPos.
namespace trans {
class coenv;
}

namespace absyntax {

class absyn : public gc {
protected:
 const position pos;

 void markPos(trans::coenv& c);

public:
 absyn(position pos)
   : pos(pos) {}

 virtual ~absyn();

 position getPos() const
 {
   return pos;
 }

 virtual void prettyprint(ostream &out, Int indent) = 0;
 virtual void createSymMap(AsymptoteLsp::SymbolContext* symContext) {}
private:  // Non-copyable
 void operator=(const absyn&);
 absyn(const absyn&);
};

void prettyindent(ostream &out, Int indent);
void prettyname(ostream &out, string name, Int indent, position pos);

class name;
class astType;
class varinit;
class exp;
class runnable;
class stm;
class dec;
class block;

typedef block file;

// This is the abstract syntax tree of a file, assigned to when running
// yyparse.
extern file *root;

}

#endif