Annotation of parser3/src/types/pa_value.h, revision 1.42
1.22 paf 1: /** @file
1.24 paf 2: Parser: Value, Method, Junction class decls.
3:
1.1 paf 4: Copyright (c) 2001 ArtLebedev Group (http://www.artlebedev.com)
1.24 paf 5:
1.2 paf 6: Author: Alexander Petrosyan <paf@design.ru> (http://design.ru/paf)
1.1 paf 7:
1.42 ! paf 8: $Id: pa_value.h,v 1.41 2001/04/02 09:29:20 paf Exp $
1.1 paf 9: */
10:
11: #ifndef PA_VALUE_H
12: #define PA_VALUE_H
13:
14: #include "pa_pool.h"
15: #include "pa_string.h"
16: #include "pa_array.h"
17: #include "pa_exception.h"
1.13 paf 18: #include "pa_globals.h"
1.1 paf 19:
1.9 paf 20: class VStateless_class;
1.1 paf 21: class WContext;
22: class VAliased;
23: class Request;
1.35 paf 24: class Table;
1.17 paf 25: class Junction;
26: class Method;
1.20 paf 27: class Hash;
1.42 ! paf 28: class VFile;
1.1 paf 29:
1.31 paf 30: /// grandfather of all @a values in @b Parser
1.1 paf 31: class Value : public Pooled {
32: public: // Value
33:
1.22 paf 34: /// - all: for error reporting after fail(), etc
1.1 paf 35: virtual const char *type() const =0;
1.22 paf 36: /// - all: for error reporting after fail(), etc
1.1 paf 37: const String& name() const { return *fname; }
1.23 paf 38: /** is this value defined?
1.22 paf 39: @return for
1.25 paf 40: - VUnknown: false
1.22 paf 41: - others: true
42: */
1.38 paf 43: virtual bool is_defined() const { return true; }
1.35 paf 44: /** is this value string?
45: @return for
46: - VString: true
47: - others: false
48: */
1.38 paf 49: virtual bool is_string() const { return false; }
1.23 paf 50: /** what's the meaning of this value in context of expression?
1.22 paf 51: @return for
1.34 paf 52: - VString: fstring as VDouble or this depending on return_string_as_is
1.25 paf 53: - VBool: this
54: - VDouble: this
55: - VInt: this
56: - VUnknown: this
1.27 paf 57: - VFile: this
1.22 paf 58: */
1.35 paf 59: virtual Value *as_expr_result(bool return_string_as_is=false) {
1.34 paf 60: bark("(%s) can not be used in expression"); return 0;
61: }
1.23 paf 62: /** extract Hash
1.22 paf 63: @return for
1.25 paf 64: - VHash: fhash
65: - VResponse: ffields
1.22 paf 66: */
1.20 paf 67: virtual Hash *get_hash() { return 0; }
1.23 paf 68: /** extract const String
1.22 paf 69: @return for
1.25 paf 70: - VString: value
71: - VUnknown: ""
72: - VDouble: value
73: - VBool: must be 0: so in ^if(1>2) it would'nt become "FALSE" string which is 'true'
1.22 paf 74: - others: 0
75: - WContext: accumulated fstring
76: */
1.1 paf 77: virtual const String *get_string() { return 0; }
1.23 paf 78: /** extract double
1.22 paf 79: @return for
1.25 paf 80: - VString: value
81: - VDouble: value
82: - VInt: finteger
83: - VBool: value
1.37 paf 84: - VUnknown: 0
1.22 paf 85: */
1.35 paf 86: virtual double as_double() { bark("(%s) does not have numerical value"); return 0; }
1.23 paf 87: /** extract bool
1.22 paf 88: @return for
1.25 paf 89: - VUnknown: false
90: - VBool: value
91: - VInt: 0 or !0
92: - VDouble: 0 or !0
1.27 paf 93: - VFile: true
1.22 paf 94: */
1.35 paf 95: virtual bool as_bool() { bark("(%s) does not have logical value"); return 0; }
1.42 ! paf 96: /** extract file
! 97: @return for
! 98: - VFile: this
! 99: - VString: vfile
! 100: - VImage: vfile
! 101: */
! 102: virtual const VFile *as_vfile() const {
! 103: bark("(%s) does not have file value"); return 0;
! 104: }
1.23 paf 105: /** extract Junction
1.22 paf 106: @return for
107: - junction: itself
108: */
1.1 paf 109: virtual Junction *get_junction() { return 0; }
1.23 paf 110: /** extract Value element
1.22 paf 111: @return for
1.25 paf 112: - VHash: (key)=value
1.29 paf 113: - VAliased: $CLASS, $BASE
114: - VStateless_class: +$method
115: - VStateless_object: +$method
1.25 paf 116: - VCode_frame: wcontext_transparent
1.26 paf 117: - VMethod_frame: my or self_transparent
1.25 paf 118: - VTable: column
1.28 paf 119: - VEnv: field
1.25 paf 120: - VForm: CLASS,BASE,method,field
121: - VString: $CLASS,$BASE,$method
1.30 paf 122: - VRequest: fields
1.25 paf 123: - VResponse: CLASS,BASE,method,fields
1.28 paf 124: - VCookie: field
1.27 paf 125: - VFile: CLASS,BASE,method,field
1.26 paf 126: */
1.36 paf 127: virtual Value *get_element(const String& name) { bark("(%s) has no elements"); return 0; }
1.31 paf 128: /** store Value element under @a name
1.22 paf 129: @return for
1.25 paf 130: - VHash: (key)=value
131: - VStateless_object: (CLASS)=vclass;(BASE)=base;(method)=method_ref
1.26 paf 132: - VStateless_class: (field)=value - static values only
133: - VStateless_object: (field)=value
1.25 paf 134: - VCode_frame: wcontext_transparent
1.26 paf 135: - VMethod_frame: my or self_transparent
1.25 paf 136: - VResponse: (attribute)=value
137: - VCookie: field
1.22 paf 138: */
1.7 paf 139: virtual void put_element(const String& name, Value *value) { bark("(%s) does not accept elements"); }
1.23 paf 140: /** extract VStateless_class
1.22 paf 141: @return for
1.25 paf 142: - VStateless_class: this
143: - VStateless_object: fclass_real
1.26 paf 144: - WContext: none yet | transparent
1.22 paf 145: */
1.9 paf 146: virtual VStateless_class *get_class() { return 0; }
1.23 paf 147: /** extract VAliased
1.22 paf 148: @return for
1.33 paf 149: - VAliased: this
1.26 paf 150: - WContext: transparent
151: - VMethod_frame: self_transparent
1.22 paf 152: */
1.1 paf 153: virtual VAliased *get_aliased() { return 0; }
1.32 paf 154:
155: /** extract VTable
156: @return for
1.35 paf 157: - VTable: ftable
1.32 paf 158: */
1.35 paf 159: virtual Table *get_table() { return 0; }
1.1 paf 160:
161: public: // usage
162:
163: Value(Pool& apool) : Pooled(apool), fname(unnamed_name) {
164: }
165:
1.22 paf 166: /// set's the name which is used in error messages
1.1 paf 167: void set_name(const String& aname) { fname=&aname; }
168:
1.26 paf 169: /// @return sure String. if it doesn't have string value barks
1.1 paf 170: const String& as_string() {
171: const String *result=get_string();
172: if(!result)
1.35 paf 173: bark("(%s) has no string representation");
1.6 paf 174:
1.1 paf 175: return *result;
176: }
177:
178: private:
179:
180: const String *fname;
181:
1.6 paf 182: protected:
1.1 paf 183:
1.22 paf 184: /// throws exception specifying bark-reason and name() type() of problematic value
185: void bark(char *reason) const {
1.1 paf 186: THROW(0,0,
187: &name(),
1.22 paf 188: reason, type());
1.1 paf 189: }
190:
1.17 paf 191: };
192:
1.23 paf 193: /** \b junction is some code joined with context of it's evaluation.
1.22 paf 194:
195: there are code-junctions and method-junctions
196: - code-junctions are used when some parameter passed in cury brackets
197: - method-junctions used in ^method[] calls or $method references
198: */
1.17 paf 199: class Junction : public Pooled {
200: public:
201:
202: Junction(Pool& apool,
203: Value& aself,
204: VStateless_class *avclass, const Method *amethod,
205: Value *aroot,
206: Value *arcontext,
207: WContext *awcontext,
208: const Array *acode) : Pooled(apool),
209:
210: self(aself),
211: vclass(avclass), method(amethod),
212: root(aroot),
213: rcontext(arcontext),
214: wcontext(awcontext),
215: code(acode) {
216: }
217:
1.22 paf 218: /// always present
1.17 paf 219: Value& self;
1.22 paf 220: //@{
221: /// @name either these // so called 'method-junction'
1.17 paf 222: VStateless_class *vclass; const Method *method;
1.22 paf 223: //@}
224: //@{
225: /// @name or these are present // so called 'code-junction'
1.17 paf 226: Value *root;
227: Value *rcontext;
228: WContext *wcontext;
229: const Array *code;
1.22 paf 230: //@}
1.17 paf 231: };
232:
1.39 paf 233: /// native code method
234: typedef void (*Native_code_ptr)(Request& request,
235: const String& method_name,
236: Array *params);
237:
1.23 paf 238: /**
1.22 paf 239: class method.
240:
241: methods can have
242: - named or
243: - numbered parameters
244:
245: methods can be
246: - parser or
247: - native onces
248:
1.40 paf 249: holds
1.22 paf 250: - parameter names or number limits
251: - local names
252: - code [parser or native]
253: */
1.17 paf 254: class Method : public Pooled {
255: public:
1.39 paf 256:
1.41 paf 257: /// allowed method call types
1.39 paf 258: enum Call_type {
1.41 paf 259: CT_ANY, ///< method can be called either statically or dynamically
260: CT_STATIC, ///< method can be called only statically
261: CT_DYNAMIC ///< method can be called only dynamically
1.39 paf 262: };
263:
264: /// name for error reporting
1.17 paf 265: const String& name;
1.39 paf 266: ///
267: Call_type call_type;
1.22 paf 268: //@{
269: /// @name either numbered params // for native-code methods = operators
1.17 paf 270: int min_numbered_params_count, max_numbered_params_count;
1.22 paf 271: //@}
272: //@{
273: /// @name or named params&locals // for parser-code methods
1.17 paf 274: Array *params_names; Array *locals_names;
1.22 paf 275: //@}
276: //@{
277: /// @name the Code
1.17 paf 278: const Array *parser_code;/*OR*/Native_code_ptr native_code;
1.22 paf 279: //@}
1.17 paf 280:
281: Method(
282: Pool& apool,
283: const String& aname,
1.39 paf 284: Call_type call_type,
1.17 paf 285: int amin_numbered_params_count, int amax_numbered_params_count,
286: Array *aparams_names, Array *alocals_names,
287: const Array *aparser_code, Native_code_ptr anative_code) :
288:
289: Pooled(apool),
290: name(aname),
1.39 paf 291: call_type(call_type),
1.17 paf 292: min_numbered_params_count(amin_numbered_params_count),
293: max_numbered_params_count(amax_numbered_params_count),
294: params_names(aparams_names), locals_names(alocals_names),
295: parser_code(aparser_code), native_code(anative_code) {
296: }
297:
1.22 paf 298: /// call this before invoking to ensure proper actual numbered params count
1.17 paf 299: void check_actual_numbered_params(
300: Value& self, const String& actual_name, Array *actual_numbered_params) const {
301: int actual_count=actual_numbered_params?actual_numbered_params->size():0;
302: if(actual_count<min_numbered_params_count) // not proper count? bark
303: THROW(0, 0,
304: &actual_name,
305: "native method of %s (%s) accepts minimum %d parameter(s)",
306: self.name().cstr(),
307: self.type(),
308: min_numbered_params_count);
309:
310: }
1.1 paf 311: };
312:
313: #endif
E-mail: