00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
#include "koscript_parsenode.h"
00021
#include "koscript_eval.h"
00022
#include "koscript_context.h"
00023
00024
#include <iostream>
00025
using namespace std;
00026
00027
extern QString idl_lexFile;
00028
extern QString toplevelFile;
00029
extern int idl_line_no;
00030
00031
typedef struct
00032
{
00033
const char *str;
00034
int data;
00035
00036 } ParseNodeDoc;
00037
00038
00039
static ParseNodeDoc parseNodeDoc[] = {
00040 {
"definitions", 0 },
00041 {
"exports", 0 },
00042 {
"t_vertical_line", 0 },
00043 {
"t_circumflex", 0 },
00044 {
"t_ampersand", 0 },
00045 {
"t_shiftright", 0 },
00046 {
"t_shiftleft", 0 },
00047 {
"t_plus_sign", 0 },
00048 {
"t_minus_sign", 0 },
00049 {
"t_asterik", 0 },
00050 {
"t_solidus", 0 },
00051 {
"t_percent_sign", 0 },
00052 {
"t_tilde", 0 },
00053 {
"t_integer_literal", 2 },
00054 {
"t_string_literal", 3 },
00055 {
"t_character_literal", 4 },
00056 {
"t_floating_pt_literal", 5 },
00057 {
"t_boolean_literal", 6 },
00058 {
"scoped_name", 1 },
00059 {
"const_dcl", 1 },
00060 {
"func_dcl", 1 },
00061 {
"func_lines", 0 },
00062 {
"assign_expr", 0 },
00063 {
"t_equal", 0 },
00064 {
"t_notequal", 0 },
00065 {
"t_less_or_equal", 0 },
00066 {
"t_greater_or_equal", 0 },
00067 {
"t_array", 0 },
00068 {
"t_dict", 0 },
00069 {
"func_params", 0 },
00070 {
"func_param_in", 1 },
00071 {
"func_param_out", 1 },
00072 {
"func_param_inout", 1 },
00073 {
"t_func_call", 0 },
00074 {
"member_expr", 1 },
00075 {
"t_array_const", 0 },
00076 {
"t_array_element", 0 },
00077 {
"t_dict_const", 0 },
00078 {
"t_dict_element", 0 },
00079 {
"t_while", 0 },
00080 {
"t_do", 0 },
00081 {
"t_for", 0 },
00082 {
"t_if", 0 },
00083 {
"t_incr", 0 },
00084 {
"t_decr", 0 },
00085 {
"t_less", 0 },
00086 {
"t_greater", 0 },
00087 {
"t_foreach", 0 },
00088 {
"t_match", 1 },
00089 {
"t_subst", 1 },
00090 {
"t_not", 0 },
00091 {
"func_call_params", 0 },
00092 {
"t_return", 0 },
00093 {
"destructor_dcl", 0 },
00094 {
"import", 1 },
00095 {
"t_struct", 1 },
00096 {
"t_strtuct_members", 1 },
00097 {
"t_qualified_names", 0 },
00098 {
"t_scope", 0 },
00099 {
"t_try", 0 },
00100 {
"t_catch", 0 },
00101 {
"t_catch_default", 0 },
00102 {
"t_raise", 0 },
00103 {
"t_cell", 0 },
00104 {
"t_range", 0 },
00105 {
"from", 0 },
00106 {
"plus_assign", 0 },
00107 {
"minus_assign", 0 },
00108 {
"bool_or", 0 },
00109 {
"bool_and", 0 },
00110 {
"t_regexp_group", 0 },
00111 {
"t_input", 0 },
00112 {
"t_line", 0 },
00113 {
"t_match_line", 0 }
00114 };
00115
00116
typedef bool (*KSEval)( KSParseNode*, KSContext& );
00117
00118
static KSEval KSEvalJump[] = {
00119 KSEval_definitions,
00120 KSEval_exports,
00121 KSEval_t_vertical_line,
00122 KSEval_t_circumflex,
00123 KSEval_t_ampersand,
00124 KSEval_t_shiftright,
00125 KSEval_t_shiftleft,
00126 KSEval_t_plus_sign,
00127 KSEval_t_minus_sign,
00128 KSEval_t_asterik,
00129 KSEval_t_solidus,
00130 KSEval_t_percent_sign,
00131 KSEval_t_tilde,
00132 KSEval_t_integer_literal,
00133 KSEval_t_string_literal,
00134 KSEval_t_character_literal,
00135 KSEval_t_floating_pt_literal,
00136 KSEval_t_boolean_literal,
00137 KSEval_scoped_name,
00138 KSEval_const_dcl,
00139 KSEval_func_dcl,
00140 KSEval_func_lines,
00141 KSEval_assign_expr,
00142 KSEval_t_equal,
00143 KSEval_t_notequal,
00144 KSEval_t_less_or_equal,
00145 KSEval_t_greater_or_equal,
00146 KSEval_t_array,
00147 KSEval_t_dict,
00148 KSEval_func_params,
00149 KSEval_func_param_in,
00150 KSEval_func_param_out,
00151 KSEval_func_param_inout,
00152 KSEval_t_func_call,
00153 KSEval_member_expr,
00154 KSEval_t_array_const,
00155 KSEval_t_array_element,
00156 KSEval_t_dict_const,
00157 KSEval_t_dict_element,
00158 KSEval_t_while,
00159 KSEval_t_do,
00160 KSEval_t_for,
00161 KSEval_t_if,
00162 KSEval_t_incr,
00163 KSEval_t_decr,
00164 KSEval_t_less,
00165 KSEval_t_greater,
00166 KSEval_t_foreach,
00167 KSEval_t_match,
00168 KSEval_t_subst,
00169 KSEval_t_not,
00170 KSEval_func_call_params,
00171 KSEval_t_return,
00172 KSEval_destructor_dcl,
00173 KSEval_import,
00174 KSEval_t_struct,
00175 KSEval_t_struct_members,
00176 KSEval_t_qualified_names,
00177 KSEval_t_scope,
00178 KSEval_t_try,
00179 KSEval_t_catch,
00180 KSEval_t_catch_default,
00181 KSEval_t_raise,
00182 KSEval_t_cell,
00183 KSEval_t_range,
00184 KSEval_from,
00185 KSEval_plus_assign,
00186 KSEval_minus_assign,
00187 KSEval_bool_or,
00188 KSEval_bool_and,
00189 KSEval_t_regexp_group,
00190 KSEval_t_input,
00191 KSEval_t_line,
00192 KSEval_t_match_line,
00193 };
00194
00195 KSParseNode::KSParseNode( KSParseNodeType aType, KSParseNode *one,
00196 KSParseNode *two, KSParseNode *three,
00197 KSParseNode *four, KSParseNode *five )
00198 {
00199 m_extra = 0;
00200 str = 0;
00201 type = aType;
00202 ident = QString::null;
00203 b1 = one;
00204 b2 = two;
00205 b3 = three;
00206 b4 = four;
00207 b5 = five;
00208 fname = idl_lexFile;
00209 line_no = idl_line_no;
00210 bIsToplevel = ( idl_lexFile == toplevelFile );
00211 }
00212
00213 KSParseNode::~KSParseNode()
00214 {
00215 clear();
00216 }
00217
00218
void KSParseNode::clear()
00219 {
00220
if ( m_extra )
delete m_extra;
00221 m_extra = 0;
00222
if ( str )
delete str;
00223 str = 0;
00224
if( b1 )
delete b1;
00225 b1 = 0;
00226
00227
00228
if( b2 && type!=t_incr && type!=t_decr )
delete b2;
00229 b2 = 0;
00230
if( b3 )
delete b3;
00231 b3 = 0;
00232
if( b4 )
delete b4;
00233 b4 = 0;
00234
if( b5 )
delete b5;
00235 b5 = 0;
00236 }
00237
00238
void KSParseNode::setIdent(
const QString& anIdent )
00239 {
00240 ident = anIdent;
00241 }
00242
00243
void KSParseNode::setIdent(
QString* anIdent )
00244 {
00245 ident = *anIdent;
00246
delete anIdent;
00247 }
00248
00249
void KSParseNode::setIdent(
const char *anIdent )
00250 {
00251 ident = anIdent;
00252 }
00253
00254
QString KSParseNode::getIdent()
00255 {
00256
return ident;
00257 }
00258
00259
QString KSParseNode::getFname()
00260 {
00261
return fname;
00262 }
00263
00264
long KSParseNode::getLineNo()
00265 {
00266
return line_no;
00267 }
00268
00269
bool KSParseNode::isToplevel()
00270 {
00271
return bIsToplevel;
00272 }
00273
00274
void KSParseNode::setIntegerLiteral( KScript::Long l )
00275 {
00276 _u._int = l;
00277 }
00278
00279 KScript::Long KSParseNode::getIntegerLiteral()
00280 {
00281
return _u._int;
00282 }
00283
00284
void KSParseNode::setStringLiteral(
const char* s )
00285 {
00286 str =
new QString( s );
00287 }
00288
00289
void KSParseNode::setStringLiteral(
const QString& s )
00290 {
00291 str =
new QString( s );
00292 }
00293
00294
void KSParseNode::setStringLiteral(
QString* s )
00295 {
00296
00297 str = s;
00298 }
00299
00300
QString KSParseNode::getStringLiteral()
00301 {
00302
return *str;
00303 }
00304
00305
void KSParseNode::setCharacterLiteral(
const KScript::Char& c )
00306 {
00307 _u._char = c.unicode();
00308 }
00309
00310
KScript::Char KSParseNode::getCharacterLiteral()
00311 {
00312
return QChar( _u._char );
00313 }
00314
00315
void KSParseNode::setFloatingPtLiteral( KScript::Double f )
00316 {
00317 _u._float = f;
00318 }
00319
00320 KScript::Double KSParseNode::getFloatingPtLiteral()
00321 {
00322
return _u._float;
00323 }
00324
00325
void KSParseNode::setBooleanLiteral( KScript::Boolean b )
00326 {
00327 _u._bool = b;
00328 }
00329
00330 KScript::Boolean KSParseNode::getBooleanLiteral()
00331 {
00332
return _u._bool;
00333 }
00334
00335 KSParseNodeType KSParseNode::getType()
const
00336
{
00337
return type;
00338 }
00339
00340
00341 KSParseNode *KSParseNode::getBranch(
int i )
00342 {
00343
switch( i ) {
00344
case 1:
00345
return b1;
00346
case 2:
00347
return b2;
00348
case 3:
00349
return b3;
00350
case 4:
00351
return b4;
00352
case 5:
00353
return b5;
00354
default:
00355 Q_ASSERT( 0 );
00356 }
00357
return 0;
00358 }
00359
00360
00361
void KSParseNode::setBranch(
int i, KSParseNode *node )
00362 {
00363
switch( i ) {
00364
case 1:
00365
if( b1 )
delete b1;
00366 b1 = node;
00367
break;
00368
case 2:
00369
if( b2 )
delete b2;
00370 b2 = node;
00371
break;
00372
case 3:
00373
if( b3 )
delete b3;
00374 b3 = node;
00375
break;
00376
case 4:
00377
if( b4 )
delete b4;
00378 b4 = node;
00379
break;
00380
case 5:
00381
if( b5 )
delete b5;
00382 b5 = node;
00383
break;
00384
default:
00385 Q_ASSERT( 0 );
00386 }
00387 }
00388
00389
00390
void KSParseNode::printBranch(
int indent,
const char *tag,
bool detailed )
00391 {
00392
for(
int i = 0; i < indent; i++ )
00393 cout <<
" ";
00394 cout << tag;
00395 cout << parseNodeDoc[ (
int) type ].str;
00396
switch( parseNodeDoc[ (
int) type ].data ) {
00397
case 0:
00398
break;
00399
case 1:
00400 cout <<
" (" << ident.local8Bit() <<
")";
00401
break;
00402
case 2:
00403 cout <<
" (" << getIntegerLiteral() <<
")";
00404
break;
00405
case 3:
00406 cout <<
" (" << getStringLiteral().local8Bit() <<
")";
00407
break;
00408
case 4:
00409 cout <<
" (" << getCharacterLiteral() <<
")";
00410
break;
00411
case 5:
00412 cout <<
" (" << getFloatingPtLiteral() <<
")";
00413
break;
00414
case 6:
00415 cout <<
" (" << getBooleanLiteral() <<
")";
00416
break;
00417
default:
00418 Q_ASSERT( 0 );
00419 }
00420 cout << endl;
00421
if( b1 )
00422 b1->printBranch( indent + 2,
"1: ", detailed );
00423
if( b2 )
00424 b2->printBranch( indent + 2,
"2: ", detailed );
00425
if( b3 )
00426 b3->printBranch( indent + 2,
"3: ", detailed );
00427
if( b4 )
00428 b4->printBranch( indent + 2,
"4: ", detailed );
00429
if( b5 )
00430 b5->printBranch( indent + 2,
"5: ", detailed );
00431 }
00432
00433
KSParseNodeExtra* KSParseNode::extra()
00434 {
00435
return m_extra;
00436 }
00437
00438
void KSParseNode::setExtra(
KSParseNodeExtra* e )
00439 {
00440 m_extra = e;
00441 }
00442
00443
void KSParseNode::print(
bool detailed )
00444 {
00445 printBranch( 0,
"", detailed );
00446 }
00447
00448
bool KSParseNode::eval( KSContext& _context )
00449 {
00450
return (KSEvalJump[ (
int)type ])(
this, _context );
00451 }