Annotation of parser3/src/include/pa_operation.h, revision 1.1.2.6.2.4
1.1.2.1 paf 1: /** @file
2: Parser: compiled code related decls.
3:
1.1.2.4 paf 4: Copyright (c) 2001-2003 ArtLebedev Group (http://www.artlebedev.com)
1.1.2.1 paf 5:
6: Author: Alexandr Petrosian <paf@design.ru> (http://paf.design.ru)
7: */
8:
1.1.2.2 paf 9: #ifndef OPERATION_H
10: #define OPERATION_H
1.1.2.1 paf 11:
1.1.2.6.2.4! paf 12: static const char* IDENT_OPERATION_H="$Date: 2003/04/02 14:16:17 $";
1.1.2.1 paf 13:
14: #include "pa_array.h"
1.1.2.6 paf 15: #include "pa_opcode.h"
16: #include "pa_value.h"
1.1.2.1 paf 17:
18: // forwards
19:
1.1.2.6.2.2 paf 20: union Operation;
1.1.2.6.2.1 paf 21: typedef Array<Operation> ArrayOperation;
1.1.2.1 paf 22:
23: /**
24: Parser source code got compiled into intermediate form of Operation-s,
1.1.2.3 paf 25: which are executed afterwards.
1.1.2.1 paf 26:
27: It is compiled into Array of Operation-s.
28: Each Operation can be either OPCODE or data pointer,
29: following the literal-instruction.
30: - OP_VALUE followed by Value*
1.1.2.3 paf 31: - OP_CURLY_CODE__STORE_PARAM followed by ArrayOperation*
32: - OP_EXPR_CODE__STORE_PARAM followed by ArrayOperation*
33: - OP_NESTED_CODE followed by ArrayOperation*
1.1.2.1 paf 34: */
1.1.2.6.2.2 paf 35: union Operation {
1.1.2.3 paf 36: public:
1.1.2.6.2.4! paf 37: struct Info {
1.1.2.6.2.3 paf 38: uint fcode:6; ///< operation code [at the moment, max=58. 2^6=64
1.1.2.6.2.2 paf 39: //@{ origin
1.1.2.6.2.3 paf 40: uint file_no:7; ///< file number (max: 128): index in Request::files table
41: uint line:12; ///< line number (max: 4096)
42: uint col:7; ///< column number (max: 128)
1.1.2.6.2.2 paf 43: //@}
1.1.2.6.2.4! paf 44: OPCODE code() const { return (OPCODE)fcode; }
! 45: void set_code(OPCODE acode) { fcode=acode; }
! 46: } info;
! 47: OPCODE code() const { return info.code(); }
! 48: void set_code(OPCODE acode) { info.set_code(acode); }
1.1.2.6.2.1 paf 49: Value* value; ///< not an operation, but rather value stored after argumented op
50: ArrayOperation* ops; ///< not an operation, but rather code array stored after argumented op
1.1.2.2 paf 51:
1.1.2.3 paf 52: /// needed to fill unused Array entries
53: Operation() {}
1.1.2.6.2.4! paf 54: Operation(OPCODE acode) {
! 55: info.fcode=acode;
! 56: info.file_no=0;
! 57: info.line=0;
! 58: info.col=0;
! 59: }
! 60: Operation(OPCODE acode, uint afile_no, uint aline, uint acol) {
! 61: info.fcode=acode;
! 62: info.file_no=afile_no;
! 63: info.line=aline;
! 64: info.col=acol;
! 65: }
1.1.2.6.2.1 paf 66: Operation(Value* avalue): value(avalue) {}
67: Operation(ArrayOperation* aops): ops(aops) {}
1.1.2.1 paf 68: };
69:
70: #endif
E-mail: