/*
* This file is part of rasdaman community.
*
* Rasdaman community is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Rasdaman community is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with rasdaman community. If not, see .
*
* Copyright 2003, 2004, 2005, 2006, 2007, 2008, 2009 Peter Baumann /
rasdaman GmbH.
*
* For more information please see
* or contact Peter Baumann via .
*/
#ifndef __SYMBTABLE_H
#define __SYMBTABLE_H
#include "parse.hh"
#include
class YSymbol;
//@ManMemo: Module: {\bf rasdl}
/**
Contains the all the symbols and the scopetree.
*/
/**
* \ingroup Rasdls
*/
class YSymbolTable {
friend class YSymbol;
public:
///
YSymbolTable();
/// get the corresponding symbol to name
const YSymbol *get_symbol(const char*name)const;
/// creates a symbol in the current scoped
bool scoped_symbol(YSymbol**result,const char*name,const YWhere&where);
/// get the symbol that defines this scope
const YSymbol *get_defining_symbol ()const;
/// search only current scope
bool search_scope (const char*,YSymbol*&)const;
/// search current scope and all abov
bool search_scopes (const char*,YSymbol*&)const;
/// search me all scopes above me, and not myself
bool search_scopes_above (const YSymbol*,YSymbol*&)const;
/// search a specified scope of a symbol
bool search_my_scope (const char*,const YSymbol*,YSymbol*&)const;
/// search the global_scope
bool search_global_scope (const char*,YSymbol*&)const;
///
void insert_symbol (YSymbol*)const;
///
void push_scope(YSymbol*);
///
const YSymbol *pop_scope();
///
struct Scope {
void output(FILE*out) const;
void insertData() const;
struct Scope *up;
struct Scope *next,*son;
YSymbol *symbols;
YSymbol *last_symbol; // last symbol defined in list {to assure correct order of symbols}
const YSymbol *owner; // which symbol is the owner of this scope
};
///
Scope *scope;
///
Scope *global_scope;
///
inline bool search_this_scope (const char*,const Scope*,YSymbol*&)const;
};
//@ManMemo: Module: {\bf rasdl}
/**
Literal used during parse process for result of an expression.
*/
struct YLiteral {
///
enum Literal_type {dLfloat,dLinteger,dLchar,dLbool,dLstring} type;
///
union {
///
double Real;
///
long Integer;
///
const char *String;
///
char Character;
///
bool Boolean;
};
};
//@ManMemo: Module: {\bf rasdl}
/**
To store constants durng parse process.
*/
struct YConstant
{
///
YLiteral value;
///
Parse_type *type;
};
//@ManMemo: Module: {\bf rasdl}
/**
Defines a symbol during parsing. It can represent various types of data.
*/
/**
* \ingroup Rasdls
*/
class YSymbol
{
friend class YSymbolTable;
public:
///
YSymbol();
///
YSymbol(const char*);
///
const char *get_name()const{return(name);};
/// defined where
YWhere where;
/// defines wether this symbol is owned by another symbol or by a scope
bool owned_by_symbol;
private:
///
const char *name;
public:
///
YSymbol *next;
///
const YSymbolTable::Scope *scope;
///
const YSymbolTable::Scope *defines;
///
enum YSymbol_type { dParse_Type,
dParse_Attribute,
dParse_Const,
dParse_Function,
dParse_Enumerator} type;
///
union
{
///
Parse_type *Type;
///
Parse_composite::Element *Attribute;
///
YConstant constant;
///
Parse_enum::Enumerator *enumerator;
};
};
#endif