//
// aegis - project change supervisor
// Copyright (C) 1994-1996, 2002-2008 Peter Miller
//
// This program 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.
//
// This program 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 this program. If not, see
// .
//
#ifndef AEGIS_AER_EXPR_H
#define AEGIS_AER_EXPR_H
#include
#include
#include
#include
/**
* The rpt_expr abstract base class is used to represent a generic
* expressson node in the report generator.
*/
class rpt_expr
{
public:
typedef aegis_shared_ptr pointer;
/**
* The destructor.
*/
virtual ~rpt_expr();
protected:
/**
* The default constructor.
*/
rpt_expr();
public:
/**
* The parse_error method is used to report parse errors, reported
* against the location of this expression node.
*/
void parse_error(const char *fmt) const;
/**
* The append method is used to append a sub-mode to the end of the
* list of child nodes of this expression node.
*/
void append(const rpt_expr::pointer &child);
/**
* The prepend method is used to prepend a sub-mode to the front of
* the list of child nodes of this expression node.
*/
void prepend(const rpt_expr::pointer &child);
/**
* The evaluate method may be used to calculate the value of the
* expression syntax tree.
*
* @param undefer
* True if deferred values should be evaluated.
* @param dereference
* True if reference values should be replaced with the
* referenced value.
*/
rpt_value::pointer evaluate(bool undefer, bool dereference) const;
/**
* The get_nchildren method is used to obtain the number of child
* nodes associated with this node.
*/
size_t get_nchildren() const { return nchild; }
/**
* The get_pos method is used to obtain the source file location
* associated with this node.
*/
rpt_position::pointer get_pos() const { return pos; }
/**
* The pos_from_lex method is used to set the exproession node's
* source code position from the lexer's current position.
*/
void pos_from_lex();
/**
* The pos_from method is used to set the exproession node's
* source code position from the source code location of another
* expression node.
*/
void pos_from(const rpt_expr::pointer &other);
protected:
/**
* The evaluate method may be used to calculate the value of the
* expression syntax tree.
*/
virtual rpt_value::pointer evaluate() const = 0;
public:
/**
* The lvalue method may be used to determine whether or not this
* expression node is an L-value (something which may appear on the
* left hand side of an assigment, a variable).
*
* The default implementation, which is true for the vast majority
* of expression nodes, returns false.
*/
virtual bool lvalue() const;
/**
* The nth_child method may be used to obtain the specified child
* node of this node.
*
* @param n
* The index of the child desired, zero based.
* @returns
* pointer to child, or NULL if index out of range
*/
rpt_expr::pointer nth_child(size_t n) const;
private:
/**
* The pos instance variable is used to remember the location of
* this expression in the source code.
*/
rpt_position::pointer pos;
/**
* The child instance variable is used to remember the base address
* of a dynamically allocated array of pointer to child expression
* nodes.
*/
rpt_expr::pointer *child;
/**
* The nchild instance variable is used to remember the number of
* elements used to date in the "child" array.
*/
size_t nchild;
/**
* The nchild_max instance variable is used to remember the
* allocated size of the "child" array.
*/
size_t nchild_max;
/**
* The copy constructor. Do not use.
*/
rpt_expr(const rpt_expr &);
/**
* The assignment operator. Do not use.
*/
rpt_expr &operator=(const rpt_expr &);
};
#endif // AEGIS_AER_EXPR_H