--- parser3/src/include/Attic/pa_value.h 2001/02/22 09:14:25 1.13 +++ parser3/src/include/Attic/pa_value.h 2001/03/10 11:44:31 1.49 @@ -1,5 +1,6 @@ + /* - $Id: pa_value.h,v 1.13 2001/02/22 09:14:25 paf Exp $ + $Id: pa_value.h,v 1.49 2001/03/10 11:44:31 paf Exp $ */ /* @@ -10,120 +11,174 @@ #define PA_VALUE_H #include "pa_pool.h" -#include "pa_exception.h" #include "pa_string.h" #include "pa_array.h" -//#include "pa_voperator.h" +#include "pa_exception.h" +#include "core.h" + +#define NAME_NAME "NAME" class Value; class VClass; -//class VOperator; class Junction; class WContext; +class VAliased; +class Request; + +typedef void (*Native_code_ptr)(Request& request, Array *params); class Method : public Pooled { public: const String& name; - Array& params_names; - Array& locals_names; - Array& code; + // either numbered params // for native-code methods = operators + int min_numbered_params_count, max_numbered_params_count; + // or named params&locals // for parser-code methods + Array *params_names; Array *locals_names; + // the Code + const Array *parser_code;/*OR*/Native_code_ptr native_code; Method( Pool& apool, const String& aname, - Array& aparams_names, - Array& alocals_names, - Array& acode) : + int amin_numbered_params_count, int amax_numbered_params_count, + Array *aparams_names, Array *alocals_names, + const Array *aparser_code, Native_code_ptr anative_code) : + Pooled(apool), name(aname), - params_names(aparams_names), - locals_names(alocals_names), - code(acode) { + min_numbered_params_count(amin_numbered_params_count), + max_numbered_params_count(amax_numbered_params_count), + params_names(aparams_names), locals_names(alocals_names), + parser_code(aparser_code), native_code(anative_code) { } -}; -/* -class Operator : public Method { - // operator module static vars stored in there - VOperator_class *self; + void check_actual_numbered_params(Array *actual_numbered_params) { + int actual_count=actual_numbered_params?actual_numbered_params->size():0; + if(actual_count2) it would'nt become "FALSE" string which is 'true' + // others: 0 + virtual const String *get_string() { return 0; } // string: value - virtual void put_string(String *astring) { failed("storing string to %s"); } - - // method_ref: self, method - virtual Method_ref *get_method_ref() { failed("extracting method reference from %s"); return 0; } + // double: value + // integer: finteger + // bool: value + virtual double get_double() { failed("getting numerical value of '%s'"); return 0; } + + // unknown: false + // bool: value + // double: 0 or !0 + // string: empty or not + // hash: size!=0 + // TODO table: count!=0 + // others: true + virtual bool get_bool() { return true; } // junction: auto_calc,root,self,rcontext,wcontext, code - virtual Junction *get_junction() { failed("getting junction from %s"); return 0; } + virtual Junction *get_junction() { return 0; } // hash: (key)=value // object_class: (field)=STATIC.value;(STATIC)=hash;(method)=method_ref with self=object_class - // object_instance: (field)=value;(STATIC)=hash;(method)=method_ref + // object_instance: (field)=value;(CLASS)=vclass;(method)=method_ref // operator_class: (field)=value - static values only - virtual Value *get_element(const String& name) { failed("getting element from %s"); return 0; } + // codeframe: wcontext_transparent + // methodframe: my or self_transparent + virtual Value *get_element(const String& name) { failed("type is '%s', can not get element from it"); return 0; } + // hash: (key)=value // object_class, operator_class: (field)=value - static values only - virtual void put_element(const String& name, Value *value) { failed("putting element to %s"); } - - // object_instance, object_class: method - virtual Method *get_method(const String& name) const { return 0; } + // object_instance: (field)=value + // codeframe: wcontext_transparent + // methodframe: my or self_transparent + virtual void put_element(const String& name, Value *value) { failed("type is '%s', can not put element to it"); } // object_class, object_instance: object_class + // wcontext: none yet | transparent virtual VClass *get_class() { return 0; } - // object_class: true when this class is this or derived from 'ancestor' - virtual bool is_or_derived_from(VClass& ancestor) { failed("thoghts of ancestors of %s"); return false; } + // valiased: this + // wcontext: transparent + // methodframe: self_transparent + virtual VAliased *get_aliased() { return 0; } -private: +public: // usage - void failed(char *action) { - pool().exception().raise(0,0, - 0, - action, type()); + Value(Pool& apool) : Pooled(apool), fname(unnamed_name) { } -}; -/* -descendants: - text:+ value:String - hash:+ keys&values:Hash - table:+ columns_order:Array, columns:Hash, rows:Array - object_class:+ STATIC:Hash, methods:Hash - object_instance:+ object_class, fields:Hash - method_ref:+ self:Value/object_class, method:String - method_self_n_params_n_locals:+ self:Value/object_class[1st try], params_locals&values:Hash[2nd try] - junction:+ self:Value, code:String -*/ + void set_name(const String& aname) { fname=&aname; } + + const String& as_string() { + const String *result=get_string(); + if(!result) + failed("getting string of '%s'"); + return *result; + } + +private: + + const String *fname; + +private: + + void failed(char *action) const; +}; #endif