diff options
Diffstat (limited to 'indra/lscript/lscript_compile/indra.y')
-rw-r--r-- | indra/lscript/lscript_compile/indra.y | 1680 |
1 files changed, 1680 insertions, 0 deletions
diff --git a/indra/lscript/lscript_compile/indra.y b/indra/lscript/lscript_compile/indra.y new file mode 100644 index 0000000000..7744649a92 --- /dev/null +++ b/indra/lscript/lscript_compile/indra.y @@ -0,0 +1,1680 @@ +%{ + #include "stdtypes.h" + #include "lscript_tree.h" + + #ifdef __cplusplus + extern "C" { + #endif + + int yylex(void); + int yyparse( void ); + int yyerror(const char *fmt, ...); + + #if LL_LINUX + // broken yacc codegen... --ryan. + #define getenv getenv_workaround + #endif + + #ifdef __cplusplus + } + #endif +%} + +%union +{ + S32 ival; + F32 fval; + char *sval; + class LLScriptType *type; + class LLScriptConstant *constant; + class LLScriptIdentifier *identifier; + class LLScriptSimpleAssignable *assignable; + class LLScriptGlobalVariable *global; + class LLScriptEvent *event; + class LLScriptEventHandler *handler; + class LLScriptExpression *expression; + class LLScriptStatement *statement; + class LLScriptGlobalFunctions *global_funcs; + class LLScriptFunctionDec *global_decl; + class LLScriptState *state; + class LLScritpGlobalStorage *global_store; + class LLScriptScript *script; +}; + +%token INTEGER +%token FLOAT_TYPE +%token STRING +%token LLKEY +%token VECTOR +%token QUATERNION +%token LIST + +%token STATE_DEFAULT +%token STATE +%token EVENT +%token JUMP +%token RETURN + +%token STATE_ENTRY +%token STATE_EXIT +%token TOUCH_START +%token TOUCH +%token TOUCH_END +%token COLLISION_START +%token COLLISION +%token COLLISION_END +%token LAND_COLLISION_START +%token LAND_COLLISION +%token LAND_COLLISION_END +%token TIMER +%token CHAT +%token SENSOR +%token NO_SENSOR +%token CONTROL +%token AT_TARGET +%token NOT_AT_TARGET +%token AT_ROT_TARGET +%token NOT_AT_ROT_TARGET +%token MONEY +%token EMAIL +%token RUN_TIME_PERMISSIONS +%token INVENTORY +%token ATTACH +%token DATASERVER +%token MOVING_START +%token MOVING_END +%token REZ +%token OBJECT_REZ +%token LINK_MESSAGE +%token REMOTE_DATA +%token HTTP_RESPONSE + +%token <sval> IDENTIFIER +%token <sval> STATE_DEFAULT + +%token <ival> INTEGER_CONSTANT +%token <ival> INTEGER_TRUE +%token <ival> INTEGER_FALSE + +%token <fval> FP_CONSTANT + +%token <sval> STRING_CONSTANT + +%token INC_OP +%token DEC_OP +%token ADD_ASSIGN +%token SUB_ASSIGN +%token MUL_ASSIGN +%token DIV_ASSIGN +%token MOD_ASSIGN + +%token EQ +%token NEQ +%token GEQ +%token LEQ + +%token BOOLEAN_AND +%token BOOLEAN_OR + +%token SHIFT_LEFT +%token SHIFT_RIGHT + +%token IF +%token ELSE +%token FOR +%token DO +%token WHILE + +%token PRINT + +%token PERIOD + +%token ZERO_VECTOR +%token ZERO_ROTATION + +%nonassoc LOWER_THAN_ELSE +%nonassoc ELSE + + +%type <script> lscript_program +%type <global_store> globals +%type <global_store> global +%type <global> global_variable +%type <assignable> simple_assignable +%type <assignable> simple_assignable_no_list +%type <constant> constant +%type <assignable> special_constant +%type <assignable> vector_constant +%type <assignable> quaternion_constant +%type <assignable> list_constant +%type <assignable> list_entries +%type <assignable> list_entry +%type <type> typename +%type <global_funcs> global_function +%type <global_decl> function_parameters +%type <global_decl> function_parameter +%type <state> states +%type <state> other_states +%type <state> default +%type <state> state +%type <handler> state_body +%type <handler> event +%type <event> state_entry +%type <event> state_exit +%type <event> touch_start +%type <event> touch +%type <event> touch_end +%type <event> collision_start +%type <event> collision +%type <event> collision_end +%type <event> land_collision_start +%type <event> land_collision +%type <event> land_collision_end +%type <event> at_target +%type <event> not_at_target +%type <event> at_rot_target +%type <event> not_at_rot_target +%type <event> money +%type <event> email +%type <event> run_time_permissions +%type <event> inventory +%type <event> attach +%type <event> dataserver +%type <event> moving_start +%type <event> moving_end +%type <event> rez +%type <event> object_rez +%type <event> remote_data +%type <event> http_response +%type <event> link_message +%type <event> timer +%type <event> chat +%type <event> sensor +%type <event> no_sensor +%type <event> control +%type <statement> compound_statement +%type <statement> statement +%type <statement> statements +%type <statement> declaration +%type <statement> ';' +%type <statement> '@' +%type <expression> nextforexpressionlist +%type <expression> forexpressionlist +%type <expression> nextfuncexpressionlist +%type <expression> funcexpressionlist +%type <expression> nextlistexpressionlist +%type <expression> listexpressionlist +%type <expression> unarypostfixexpression +%type <expression> vector_initializer +%type <expression> quaternion_initializer +%type <expression> list_initializer +%type <expression> lvalue +%type <expression> '-' +%type <expression> '!' +%type <expression> '~' +%type <expression> '=' +%type <expression> '<' +%type <expression> '>' +%type <expression> '+' +%type <expression> '*' +%type <expression> '/' +%type <expression> '%' +%type <expression> '&' +%type <expression> '|' +%type <expression> '^' +%type <expression> ADD_ASSIGN +%type <expression> SUB_ASSIGN +%type <expression> MUL_ASSIGN +%type <expression> DIV_ASSIGN +%type <expression> MOD_ASSIGN +%type <expression> EQ +%type <expression> NEQ +%type <expression> LEQ +%type <expression> GEQ +%type <expression> BOOLEAN_AND +%type <expression> BOOLEAN_OR +%type <expression> SHIFT_LEFT +%type <expression> SHIFT_RIGHT +%type <expression> INC_OP +%type <expression> DEC_OP +%type <expression> '(' +%type <expression> ')' +%type <expression> PRINT +%type <identifier> name_type +%type <expression> expression +%type <expression> unaryexpression +%type <expression> typecast + +%right '=' MUL_ASSIGN DIV_ASSIGN MOD_ASSIGN ADD_ASSIGN SUB_ASSIGN +%left BOOLEAN_AND BOOLEAN_OR +%left '|' +%left '^' +%left '&' +%left EQ NEQ +%left '<' LEQ '>' GEQ +%left SHIFT_LEFT SHIFT_RIGHT +%left '+' '-' +%left '*' '/' '%' +%right '!' '~' INC_OP DEC_OP +%nonassoc INITIALIZER + +%% + +lscript_program + : globals states + { + $$ = new LLScriptScript($1, $2); + gAllocationManager->addAllocation($$); + gScriptp = $$; + } + | states + { + $$ = new LLScriptScript(NULL, $1); + gAllocationManager->addAllocation($$); + gScriptp = $$; + } + ; + +globals + : global + { + $$ = $1; + } + | global globals + { + $$ = $1; + $1->addGlobal($2); + } + ; + +global + : global_variable + { + $$ = new LLScritpGlobalStorage($1); + gAllocationManager->addAllocation($$); + } + | global_function + { + $$ = new LLScritpGlobalStorage($1); + gAllocationManager->addAllocation($$); + } + ; + +name_type + : typename IDENTIFIER + { + $$ = new LLScriptIdentifier(gLine, gColumn, $2, $1); + gAllocationManager->addAllocation($$); + } + ; + +global_variable + : name_type ';' + { + $$ = new LLScriptGlobalVariable(gLine, gColumn, $1->mType, $1, NULL); + gAllocationManager->addAllocation($$); + } + | name_type '=' simple_assignable ';' + { + $$ = new LLScriptGlobalVariable(gLine, gColumn, $1->mType, $1, $3); + gAllocationManager->addAllocation($$); + } + ; + +simple_assignable + : simple_assignable_no_list + { + $$ = $1; + } + | list_constant + { + $$ = $1; + } + ; + +simple_assignable_no_list + : IDENTIFIER + { + LLScriptIdentifier *id = new LLScriptIdentifier(gLine, gColumn, $1); + gAllocationManager->addAllocation(id); + $$ = new LLScriptSAIdentifier(gLine, gColumn, id); + gAllocationManager->addAllocation($$); + } + | constant + { + $$ = new LLScriptSAConstant(gLine, gColumn, $1); + gAllocationManager->addAllocation($$); + } + | special_constant + { + $$ = $1; + } + ; + +constant + : INTEGER_CONSTANT + { + $$ = new LLScriptConstantInteger(gLine, gColumn, $1); + gAllocationManager->addAllocation($$); + } + | INTEGER_TRUE + { + $$ = new LLScriptConstantInteger(gLine, gColumn, $1); + gAllocationManager->addAllocation($$); + } + | INTEGER_FALSE + { + $$ = new LLScriptConstantInteger(gLine, gColumn, $1); + gAllocationManager->addAllocation($$); + } + | FP_CONSTANT + { + $$ = new LLScriptConstantFloat(gLine, gColumn, $1); + gAllocationManager->addAllocation($$); + } + | STRING_CONSTANT + { + $$ = new LLScriptConstantString(gLine, gColumn, $1); + gAllocationManager->addAllocation($$); + } + ; + +special_constant + : vector_constant + { + $$ = $1; + } + | quaternion_constant + { + $$ = $1; + } + ; + +vector_constant + : '<' simple_assignable ',' simple_assignable ',' simple_assignable '>' + { + $$ = new LLScriptSAVector(gLine, gColumn, $2, $4, $6); + gAllocationManager->addAllocation($$); + } + | ZERO_VECTOR + { + LLScriptConstantFloat *cf0 = new LLScriptConstantFloat(gLine, gColumn, 0.f); + gAllocationManager->addAllocation(cf0); + LLScriptSAConstant *sa0 = new LLScriptSAConstant(gLine, gColumn, cf0); + gAllocationManager->addAllocation(sa0); + LLScriptConstantFloat *cf1 = new LLScriptConstantFloat(gLine, gColumn, 0.f); + gAllocationManager->addAllocation(cf1); + LLScriptSAConstant *sa1 = new LLScriptSAConstant(gLine, gColumn, cf1); + gAllocationManager->addAllocation(sa1); + LLScriptConstantFloat *cf2 = new LLScriptConstantFloat(gLine, gColumn, 0.f); + gAllocationManager->addAllocation(cf2); + LLScriptSAConstant *sa2 = new LLScriptSAConstant(gLine, gColumn, cf2); + gAllocationManager->addAllocation(sa2); + $$ = new LLScriptSAVector(gLine, gColumn, sa0, sa1, sa2); + gAllocationManager->addAllocation($$); + } + ; + +quaternion_constant + : '<' simple_assignable ',' simple_assignable ',' simple_assignable ',' simple_assignable '>' + { + $$ = new LLScriptSAQuaternion(gLine, gColumn, $2, $4, $6, $8); + gAllocationManager->addAllocation($$); + } + | ZERO_ROTATION + { + LLScriptConstantFloat *cf0 = new LLScriptConstantFloat(gLine, gColumn, 0.f); + gAllocationManager->addAllocation(cf0); + LLScriptSAConstant *sa0 = new LLScriptSAConstant(gLine, gColumn, cf0); + gAllocationManager->addAllocation(sa0); + LLScriptConstantFloat *cf1 = new LLScriptConstantFloat(gLine, gColumn, 0.f); + gAllocationManager->addAllocation(cf1); + LLScriptSAConstant *sa1 = new LLScriptSAConstant(gLine, gColumn, cf1); + gAllocationManager->addAllocation(sa1); + LLScriptConstantFloat *cf2 = new LLScriptConstantFloat(gLine, gColumn, 0.f); + gAllocationManager->addAllocation(cf2); + LLScriptSAConstant *sa2 = new LLScriptSAConstant(gLine, gColumn, cf2); + gAllocationManager->addAllocation(sa2); + LLScriptConstantFloat *cf3 = new LLScriptConstantFloat(gLine, gColumn, 1.f); + gAllocationManager->addAllocation(cf3); + LLScriptSAConstant *sa3 = new LLScriptSAConstant(gLine, gColumn, cf3); + gAllocationManager->addAllocation(sa3); + $$ = new LLScriptSAQuaternion(gLine, gColumn, sa0, sa1, sa2, sa3); + gAllocationManager->addAllocation($$); + } + ; + +list_constant + : '[' list_entries ']' + { + $$ = new LLScriptSAList(gLine, gColumn, $2); + gAllocationManager->addAllocation($$); + } + | '[' ']' + { + $$ = new LLScriptSAList(gLine, gColumn, NULL); + gAllocationManager->addAllocation($$); + } + ; + +list_entries + : list_entry + { + $$ = $1; + } + | list_entry ',' list_entries + { + $$ = $1; + $1->addAssignable($3); + } + ; + +list_entry + : simple_assignable_no_list + { + $$ = $1; + } + ; + +typename + : INTEGER + { + $$ = new LLScriptType(gLine, gColumn, LST_INTEGER); + gAllocationManager->addAllocation($$); + } + | FLOAT_TYPE + { + $$ = new LLScriptType(gLine, gColumn, LST_FLOATINGPOINT); + gAllocationManager->addAllocation($$); + } + | STRING + { + $$ = new LLScriptType(gLine, gColumn, LST_STRING); + gAllocationManager->addAllocation($$); + } + | LLKEY + { + $$ = new LLScriptType(gLine, gColumn, LST_KEY); + gAllocationManager->addAllocation($$); + } + | VECTOR + { + $$ = new LLScriptType(gLine, gColumn, LST_VECTOR); + gAllocationManager->addAllocation($$); + } + | QUATERNION + { + $$ = new LLScriptType(gLine, gColumn, LST_QUATERNION); + gAllocationManager->addAllocation($$); + } + | LIST + { + $$ = new LLScriptType(gLine, gColumn, LST_LIST); + gAllocationManager->addAllocation($$); + } + ; + +global_function + : IDENTIFIER '(' ')' compound_statement + { + LLScriptIdentifier *id = new LLScriptIdentifier(gLine, gColumn, $1); + gAllocationManager->addAllocation(id); + $$ = new LLScriptGlobalFunctions(gLine, gColumn, NULL, id, NULL, $4); + gAllocationManager->addAllocation($$); + } + | name_type '(' ')' compound_statement + { + $$ = new LLScriptGlobalFunctions(gLine, gColumn, $1->mType, $1, NULL, $4); + gAllocationManager->addAllocation($$); + } + | IDENTIFIER '(' function_parameters ')' compound_statement + { + LLScriptIdentifier *id = new LLScriptIdentifier(gLine, gColumn, $1); + gAllocationManager->addAllocation(id); + $$ = new LLScriptGlobalFunctions(gLine, gColumn, NULL, id, $3, $5); + gAllocationManager->addAllocation($$); + } + | name_type '(' function_parameters ')' compound_statement + { + $$ = new LLScriptGlobalFunctions(gLine, gColumn, $1->mType, $1, $3, $5); + gAllocationManager->addAllocation($$); + } + ; + +function_parameters + : function_parameter + { + $$ = $1; + } + | function_parameter ',' function_parameters + { + $$ = $1; + $1->addFunctionParameter($3); + } + ; + +function_parameter + : typename IDENTIFIER + { + LLScriptIdentifier *id = new LLScriptIdentifier(gLine, gColumn, $2); + gAllocationManager->addAllocation(id); + $$ = new LLScriptFunctionDec(gLine, gColumn, $1, id); + gAllocationManager->addAllocation($$); + } + ; + +states + : default + { + $$ = $1; + } + | default other_states + { + $$ = $1; + $1->mNextp = $2; + } + ; + +other_states + : state + { + $$ = $1; + } + | state other_states + { + $$ = $1; + $1->addState($2); + } + ; + +default + : STATE_DEFAULT '{' state_body '}' + { + LLScriptIdentifier *id = new LLScriptIdentifier(gLine, gColumn, $1); + gAllocationManager->addAllocation(id); + $$ = new LLScriptState(gLine, gColumn, LSSTYPE_DEFAULT, id, $3); + gAllocationManager->addAllocation($$); + } + ; + +state + : STATE IDENTIFIER '{' state_body '}' + { + LLScriptIdentifier *id = new LLScriptIdentifier(gLine, gColumn, $2); + gAllocationManager->addAllocation(id); + $$ = new LLScriptState(gLine, gColumn, LSSTYPE_USER, id, $4); + gAllocationManager->addAllocation($$); + } + ; + +state_body + : event + { + $$ = $1; + } + | event state_body + { + $$ = $1; + $1->addEvent($2); + } + ; + +event + : state_entry compound_statement + { + $$ = new LLScriptEventHandler(gLine, gColumn, $1, $2); + gAllocationManager->addAllocation($$); + } + | state_exit compound_statement + { + $$ = new LLScriptEventHandler(gLine, gColumn, $1, $2); + gAllocationManager->addAllocation($$); + } + | touch_start compound_statement + { + $$ = new LLScriptEventHandler(gLine, gColumn, $1, $2); + gAllocationManager->addAllocation($$); + } + | touch compound_statement + { + $$ = new LLScriptEventHandler(gLine, gColumn, $1, $2); + gAllocationManager->addAllocation($$); + } + | touch_end compound_statement + { + $$ = new LLScriptEventHandler(gLine, gColumn, $1, $2); + gAllocationManager->addAllocation($$); + } + | collision_start compound_statement + { + $$ = new LLScriptEventHandler(gLine, gColumn, $1, $2); + gAllocationManager->addAllocation($$); + } + | collision compound_statement + { + $$ = new LLScriptEventHandler(gLine, gColumn, $1, $2); + gAllocationManager->addAllocation($$); + } + | collision_end compound_statement + { + $$ = new LLScriptEventHandler(gLine, gColumn, $1, $2); + gAllocationManager->addAllocation($$); + } + | land_collision_start compound_statement + { + $$ = new LLScriptEventHandler(gLine, gColumn, $1, $2); + gAllocationManager->addAllocation($$); + } + | land_collision compound_statement + { + $$ = new LLScriptEventHandler(gLine, gColumn, $1, $2); + gAllocationManager->addAllocation($$); + } + | land_collision_end compound_statement + { + $$ = new LLScriptEventHandler(gLine, gColumn, $1, $2); + gAllocationManager->addAllocation($$); + } + | timer compound_statement + { + $$ = new LLScriptEventHandler(gLine, gColumn, $1, $2); + gAllocationManager->addAllocation($$); + } + | chat compound_statement + { + $$ = new LLScriptEventHandler(gLine, gColumn, $1, $2); + gAllocationManager->addAllocation($$); + } + | sensor compound_statement + { + $$ = new LLScriptEventHandler(gLine, gColumn, $1, $2); + gAllocationManager->addAllocation($$); + } + | no_sensor compound_statement + { + $$ = new LLScriptEventHandler(gLine, gColumn, $1, $2); + gAllocationManager->addAllocation($$); + } + | at_target compound_statement + { + $$ = new LLScriptEventHandler(gLine, gColumn, $1, $2); + gAllocationManager->addAllocation($$); + } + | not_at_target compound_statement + { + $$ = new LLScriptEventHandler(gLine, gColumn, $1, $2); + gAllocationManager->addAllocation($$); + } + | at_rot_target compound_statement + { + $$ = new LLScriptEventHandler(gLine, gColumn, $1, $2); + gAllocationManager->addAllocation($$); + } + | not_at_rot_target compound_statement + { + $$ = new LLScriptEventHandler(gLine, gColumn, $1, $2); + gAllocationManager->addAllocation($$); + } + | money compound_statement + { + $$ = new LLScriptEventHandler(gLine, gColumn, $1, $2); + gAllocationManager->addAllocation($$); + } + | email compound_statement + { + $$ = new LLScriptEventHandler(gLine, gColumn, $1, $2); + gAllocationManager->addAllocation($$); + } + | run_time_permissions compound_statement + { + $$ = new LLScriptEventHandler(gLine, gColumn, $1, $2); + gAllocationManager->addAllocation($$); + } + | inventory compound_statement + { + $$ = new LLScriptEventHandler(gLine, gColumn, $1, $2); + gAllocationManager->addAllocation($$); + } + | attach compound_statement + { + $$ = new LLScriptEventHandler(gLine, gColumn, $1, $2); + gAllocationManager->addAllocation($$); + } + | dataserver compound_statement + { + $$ = new LLScriptEventHandler(gLine, gColumn, $1, $2); + gAllocationManager->addAllocation($$); + } + | control compound_statement + { + $$ = new LLScriptEventHandler(gLine, gColumn, $1, $2); + gAllocationManager->addAllocation($$); + } + | moving_start compound_statement + { + $$ = new LLScriptEventHandler(gLine, gColumn, $1, $2); + gAllocationManager->addAllocation($$); + } + | moving_end compound_statement + { + $$ = new LLScriptEventHandler(gLine, gColumn, $1, $2); + gAllocationManager->addAllocation($$); + } + | rez compound_statement + { + $$ = new LLScriptEventHandler(gLine, gColumn, $1, $2); + gAllocationManager->addAllocation($$); + } + | object_rez compound_statement + { + $$ = new LLScriptEventHandler(gLine, gColumn, $1, $2); + gAllocationManager->addAllocation($$); + } + | link_message compound_statement + { + $$ = new LLScriptEventHandler(gLine, gColumn, $1, $2); + gAllocationManager->addAllocation($$); + } + | remote_data compound_statement + { + $$ = new LLScriptEventHandler(gLine, gColumn, $1, $2); + gAllocationManager->addAllocation($$); + } + | http_response compound_statement + { + $$ = new LLScriptEventHandler(gLine, gColumn, $1, $2); + gAllocationManager->addAllocation($$); + } + ; + +state_entry + : STATE_ENTRY '(' ')' + { + $$ = new LLScriptStateEntryEvent(gLine, gColumn); + gAllocationManager->addAllocation($$); + } + ; + +state_exit + : STATE_EXIT '(' ')' + { + $$ = new LLScriptStateExitEvent(gLine, gColumn); + gAllocationManager->addAllocation($$); + } + ; + +touch_start + : TOUCH_START '(' INTEGER IDENTIFIER ')' + { + LLScriptIdentifier *id1 = new LLScriptIdentifier(gLine, gColumn, $4); + gAllocationManager->addAllocation(id1); + $$ = new LLScriptTouchStartEvent(gLine, gColumn, id1); + gAllocationManager->addAllocation($$); + } + ; + +touch + : TOUCH '(' INTEGER IDENTIFIER ')' + { + LLScriptIdentifier *id1 = new LLScriptIdentifier(gLine, gColumn, $4); + gAllocationManager->addAllocation(id1); + $$ = new LLScriptTouchEvent(gLine, gColumn, id1); + gAllocationManager->addAllocation($$); + } + ; + +touch_end + : TOUCH_END '(' INTEGER IDENTIFIER ')' + { + LLScriptIdentifier *id1 = new LLScriptIdentifier(gLine, gColumn, $4); + gAllocationManager->addAllocation(id1); + $$ = new LLScriptTouchEndEvent(gLine, gColumn, id1); + gAllocationManager->addAllocation($$); + } + ; + +collision_start + : COLLISION_START '(' INTEGER IDENTIFIER ')' + { + LLScriptIdentifier *id1 = new LLScriptIdentifier(gLine, gColumn, $4); + gAllocationManager->addAllocation(id1); + $$ = new LLScriptCollisionStartEvent(gLine, gColumn, id1); + gAllocationManager->addAllocation($$); + } + ; + +collision + : COLLISION '(' INTEGER IDENTIFIER ')' + { + LLScriptIdentifier *id1 = new LLScriptIdentifier(gLine, gColumn, $4); + gAllocationManager->addAllocation(id1); + $$ = new LLScriptCollisionEvent(gLine, gColumn, id1); + gAllocationManager->addAllocation($$); + } + ; + +collision_end + : COLLISION_END '(' INTEGER IDENTIFIER ')' + { + LLScriptIdentifier *id1 = new LLScriptIdentifier(gLine, gColumn, $4); + gAllocationManager->addAllocation(id1); + $$ = new LLScriptCollisionEndEvent(gLine, gColumn, id1); + gAllocationManager->addAllocation($$); + } + ; + +land_collision_start + : LAND_COLLISION_START '(' VECTOR IDENTIFIER ')' + { + LLScriptIdentifier *id1 = new LLScriptIdentifier(gLine, gColumn, $4); + gAllocationManager->addAllocation(id1); + $$ = new LLScriptLandCollisionStartEvent(gLine, gColumn, id1); + gAllocationManager->addAllocation($$); + } + ; + +land_collision + : LAND_COLLISION '(' VECTOR IDENTIFIER ')' + { + LLScriptIdentifier *id1 = new LLScriptIdentifier(gLine, gColumn, $4); + gAllocationManager->addAllocation(id1); + $$ = new LLScriptLandCollisionEvent(gLine, gColumn, id1); + gAllocationManager->addAllocation($$); + } + ; + +land_collision_end + : LAND_COLLISION_END '(' VECTOR IDENTIFIER ')' + { + LLScriptIdentifier *id1 = new LLScriptIdentifier(gLine, gColumn, $4); + gAllocationManager->addAllocation(id1); + $$ = new LLScriptLandCollisionEndEvent(gLine, gColumn, id1); + gAllocationManager->addAllocation($$); + } + ; + +at_target + : AT_TARGET '(' INTEGER IDENTIFIER ',' VECTOR IDENTIFIER ',' VECTOR IDENTIFIER ')' + { + LLScriptIdentifier *id1 = new LLScriptIdentifier(gLine, gColumn, $4); + gAllocationManager->addAllocation(id1); + LLScriptIdentifier *id2 = new LLScriptIdentifier(gLine, gColumn, $7); + gAllocationManager->addAllocation(id2); + LLScriptIdentifier *id3 = new LLScriptIdentifier(gLine, gColumn, $10); + gAllocationManager->addAllocation(id3); + $$ = new LLScriptAtTarget(gLine, gColumn, id1, id2, id3); + gAllocationManager->addAllocation($$); + } + ; + +not_at_target + : NOT_AT_TARGET '(' ')' + { + $$ = new LLScriptNotAtTarget(gLine, gColumn); + gAllocationManager->addAllocation($$); + } + ; + +at_rot_target + : AT_ROT_TARGET '(' INTEGER IDENTIFIER ',' QUATERNION IDENTIFIER ',' QUATERNION IDENTIFIER ')' + { + LLScriptIdentifier *id1 = new LLScriptIdentifier(gLine, gColumn, $4); + gAllocationManager->addAllocation(id1); + LLScriptIdentifier *id2 = new LLScriptIdentifier(gLine, gColumn, $7); + gAllocationManager->addAllocation(id2); + LLScriptIdentifier *id3 = new LLScriptIdentifier(gLine, gColumn, $10); + gAllocationManager->addAllocation(id3); + $$ = new LLScriptAtRotTarget(gLine, gColumn, id1, id2, id3); + gAllocationManager->addAllocation($$); + } + ; + +not_at_rot_target + : NOT_AT_ROT_TARGET '(' ')' + { + $$ = new LLScriptNotAtRotTarget(gLine, gColumn); + gAllocationManager->addAllocation($$); + } + ; + +money + : MONEY '(' LLKEY IDENTIFIER ',' INTEGER IDENTIFIER ')' + { + LLScriptIdentifier *id1 = new LLScriptIdentifier(gLine, gColumn, $4); + gAllocationManager->addAllocation(id1); + LLScriptIdentifier *id2 = new LLScriptIdentifier(gLine, gColumn, $7); + gAllocationManager->addAllocation(id2); + $$ = new LLScriptMoneyEvent(gLine, gColumn, id1, id2); + gAllocationManager->addAllocation($$); + } + ; + +email + : EMAIL '(' STRING IDENTIFIER ',' STRING IDENTIFIER ',' STRING IDENTIFIER ',' STRING IDENTIFIER ',' INTEGER IDENTIFIER ')' + { + LLScriptIdentifier *id1 = new LLScriptIdentifier(gLine, gColumn, $4); + gAllocationManager->addAllocation(id1); + LLScriptIdentifier *id2 = new LLScriptIdentifier(gLine, gColumn, $7); + gAllocationManager->addAllocation(id2); + LLScriptIdentifier *id3 = new LLScriptIdentifier(gLine, gColumn, $10); + gAllocationManager->addAllocation(id3); + LLScriptIdentifier *id4 = new LLScriptIdentifier(gLine, gColumn, $13); + gAllocationManager->addAllocation(id4); + LLScriptIdentifier *id5 = new LLScriptIdentifier(gLine, gColumn, $16); + gAllocationManager->addAllocation(id5); + $$ = new LLScriptEmailEvent(gLine, gColumn, id1, id2, id3, id4, id5); + gAllocationManager->addAllocation($$); + } + ; + +run_time_permissions + : RUN_TIME_PERMISSIONS '(' INTEGER IDENTIFIER ')' + { + LLScriptIdentifier *id1 = new LLScriptIdentifier(gLine, gColumn, $4); + gAllocationManager->addAllocation(id1); + $$ = new LLScriptRTPEvent(gLine, gColumn, id1); + gAllocationManager->addAllocation($$); + } + ; + +inventory + : INVENTORY '(' INTEGER IDENTIFIER ')' + { + LLScriptIdentifier *id1 = new LLScriptIdentifier(gLine, gColumn, $4); + gAllocationManager->addAllocation(id1); + $$ = new LLScriptInventoryEvent(gLine, gColumn, id1); + gAllocationManager->addAllocation($$); + } + ; + +attach + : ATTACH '(' LLKEY IDENTIFIER ')' + { + LLScriptIdentifier *id1 = new LLScriptIdentifier(gLine, gColumn, $4); + gAllocationManager->addAllocation(id1); + $$ = new LLScriptAttachEvent(gLine, gColumn, id1); + gAllocationManager->addAllocation($$); + } + ; + +dataserver + : DATASERVER '(' LLKEY IDENTIFIER ',' STRING IDENTIFIER')' + { + LLScriptIdentifier *id1 = new LLScriptIdentifier(gLine, gColumn, $4); + gAllocationManager->addAllocation(id1); + LLScriptIdentifier *id2 = new LLScriptIdentifier(gLine, gColumn, $7); + gAllocationManager->addAllocation(id2); + $$ = new LLScriptDataserverEvent(gLine, gColumn, id1, id2); + gAllocationManager->addAllocation($$); + } + ; + +moving_start + : MOVING_START '(' ')' + { + $$ = new LLScriptMovingStartEvent(gLine, gColumn); + gAllocationManager->addAllocation($$); + } + ; + +moving_end + : MOVING_END '(' ')' + { + $$ = new LLScriptMovingEndEvent(gLine, gColumn); + gAllocationManager->addAllocation($$); + } + ; + +timer + : TIMER '(' ')' + { + $$ = new LLScriptTimerEvent(gLine, gColumn); + gAllocationManager->addAllocation($$); + } + ; + +chat + : CHAT '(' INTEGER IDENTIFIER ',' STRING IDENTIFIER ',' LLKEY IDENTIFIER ',' STRING IDENTIFIER ')' + { + LLScriptIdentifier *id1 = new LLScriptIdentifier(gLine, gColumn, $4); + gAllocationManager->addAllocation(id1); + LLScriptIdentifier *id2 = new LLScriptIdentifier(gLine, gColumn, $7); + gAllocationManager->addAllocation(id2); + LLScriptIdentifier *id3 = new LLScriptIdentifier(gLine, gColumn, $10); + gAllocationManager->addAllocation(id3); + LLScriptIdentifier *id4 = new LLScriptIdentifier(gLine, gColumn, $13); + gAllocationManager->addAllocation(id4); + $$ = new LLScriptChatEvent(gLine, gColumn, id1, id2, id3, id4); + gAllocationManager->addAllocation($$); + } + ; + +sensor + : SENSOR '(' INTEGER IDENTIFIER ')' + { + LLScriptIdentifier *id1 = new LLScriptIdentifier(gLine, gColumn, $4); + gAllocationManager->addAllocation(id1); + $$ = new LLScriptSensorEvent(gLine, gColumn, id1); + gAllocationManager->addAllocation($$); + } + ; + +no_sensor + : NO_SENSOR '(' ')' + { + $$ = new LLScriptNoSensorEvent(gLine, gColumn); + gAllocationManager->addAllocation($$); + } + ; + +control + : CONTROL '(' LLKEY IDENTIFIER ',' INTEGER IDENTIFIER ',' INTEGER IDENTIFIER ')' + { + LLScriptIdentifier *id1 = new LLScriptIdentifier(gLine, gColumn, $4); + gAllocationManager->addAllocation(id1); + LLScriptIdentifier *id2 = new LLScriptIdentifier(gLine, gColumn, $7); + gAllocationManager->addAllocation(id2); + LLScriptIdentifier *id3 = new LLScriptIdentifier(gLine, gColumn, $10); + gAllocationManager->addAllocation(id3); + $$ = new LLScriptControlEvent(gLine, gColumn, id1, id2, id3); + gAllocationManager->addAllocation($$); + } + ; + +rez + : REZ '(' INTEGER IDENTIFIER ')' + { + LLScriptIdentifier *id1 = new LLScriptIdentifier(gLine, gColumn, $4); + gAllocationManager->addAllocation(id1); + $$ = new LLScriptRezEvent(gLine, gColumn, id1); + gAllocationManager->addAllocation($$); + } + ; + +object_rez + : OBJECT_REZ '(' LLKEY IDENTIFIER ')' + { + LLScriptIdentifier *id1 = new LLScriptIdentifier(gLine, gColumn, $4); + gAllocationManager->addAllocation(id1); + $$ = new LLScriptObjectRezEvent(gLine, gColumn, id1); + gAllocationManager->addAllocation($$); + } + ; + +link_message + : LINK_MESSAGE '(' INTEGER IDENTIFIER ',' INTEGER IDENTIFIER ',' STRING IDENTIFIER ',' LLKEY IDENTIFIER ')' + { + LLScriptIdentifier *id1 = new LLScriptIdentifier(gLine, gColumn, $4); + gAllocationManager->addAllocation(id1); + LLScriptIdentifier *id2 = new LLScriptIdentifier(gLine, gColumn, $7); + gAllocationManager->addAllocation(id2); + LLScriptIdentifier *id3 = new LLScriptIdentifier(gLine, gColumn, $10); + gAllocationManager->addAllocation(id3); + LLScriptIdentifier *id4 = new LLScriptIdentifier(gLine, gColumn, $13); + gAllocationManager->addAllocation(id4); + $$ = new LLScriptLinkMessageEvent(gLine, gColumn, id1, id2, id3, id4); + gAllocationManager->addAllocation($$); + } + ; + +remote_data + : REMOTE_DATA '(' INTEGER IDENTIFIER ',' LLKEY IDENTIFIER ',' LLKEY IDENTIFIER ',' STRING IDENTIFIER ',' INTEGER IDENTIFIER ',' STRING IDENTIFIER ')' + { + LLScriptIdentifier *id1 = new LLScriptIdentifier(gLine, gColumn, $4); + gAllocationManager->addAllocation(id1); + LLScriptIdentifier *id2 = new LLScriptIdentifier(gLine, gColumn, $7); + gAllocationManager->addAllocation(id2); + LLScriptIdentifier *id3 = new LLScriptIdentifier(gLine, gColumn, $10); + gAllocationManager->addAllocation(id3); + LLScriptIdentifier *id4 = new LLScriptIdentifier(gLine, gColumn, $13); + gAllocationManager->addAllocation(id4); + LLScriptIdentifier *id5 = new LLScriptIdentifier(gLine, gColumn, $16); + gAllocationManager->addAllocation(id4); + LLScriptIdentifier *id6 = new LLScriptIdentifier(gLine, gColumn, $19); + gAllocationManager->addAllocation(id4); + $$ = new LLScriptRemoteEvent(gLine, gColumn, id1, id2, id3, id4, id5, id6); + gAllocationManager->addAllocation($$); + } + ; + +http_response + : HTTP_RESPONSE '(' LLKEY IDENTIFIER ',' INTEGER IDENTIFIER ',' LIST IDENTIFIER ',' STRING IDENTIFIER ')' + { + LLScriptIdentifier *id1 = new LLScriptIdentifier(gLine, gColumn, $4); + gAllocationManager->addAllocation(id1); + LLScriptIdentifier *id2 = new LLScriptIdentifier(gLine, gColumn, $7); + gAllocationManager->addAllocation(id2); + LLScriptIdentifier *id3 = new LLScriptIdentifier(gLine, gColumn, $10); + gAllocationManager->addAllocation(id3); + LLScriptIdentifier *id4 = new LLScriptIdentifier(gLine, gColumn, $13); + gAllocationManager->addAllocation(id4); + $$ = new LLScriptHTTPResponseEvent(gLine, gColumn, id1, id2, id3, id4); + gAllocationManager->addAllocation($$); + } + ; + +compound_statement + : '{' '}' + { + $$ = new LLScriptCompoundStatement(gLine, gColumn, NULL); + gAllocationManager->addAllocation($$); + } + | '{' statements '}' + { + $$ = new LLScriptCompoundStatement(gLine, gColumn, $2); + gAllocationManager->addAllocation($$); + } + ; + +statements + : statement + { + $$ = $1; + } + | statements statement + { + $$ = new LLScriptStatementSequence(gLine, gColumn, $1, $2); + gAllocationManager->addAllocation($$); + } + ; + +statement + : ';' + { + $$ = new LLScriptNOOP(gLine, gColumn); + gAllocationManager->addAllocation($$); + } + | STATE IDENTIFIER ';' + { + LLScriptIdentifier *id = new LLScriptIdentifier(gLine, gColumn, $2); + gAllocationManager->addAllocation(id); + $$ = new LLScriptStateChange(gLine, gColumn, id); + gAllocationManager->addAllocation($$); + } + | STATE STATE_DEFAULT ';' + { + LLScriptIdentifier *id = new LLScriptIdentifier(gLine, gColumn, $2); + gAllocationManager->addAllocation(id); + $$ = new LLScriptStateChange(gLine, gColumn, id); + gAllocationManager->addAllocation($$); + } + | JUMP IDENTIFIER ';' + { + LLScriptIdentifier *id = new LLScriptIdentifier(gLine, gColumn, $2); + gAllocationManager->addAllocation(id); + $$ = new LLScriptJump(gLine, gColumn, id); + gAllocationManager->addAllocation($$); + } + | '@' IDENTIFIER ';' + { + LLScriptIdentifier *id = new LLScriptIdentifier(gLine, gColumn, $2); + gAllocationManager->addAllocation(id); + $$ = new LLScriptLabel(gLine, gColumn, id); + gAllocationManager->addAllocation($$); + } + | RETURN expression ';' + { + $$ = new LLScriptReturn(gLine, gColumn, $2); + gAllocationManager->addAllocation($$); + } + | RETURN ';' + { + $$ = new LLScriptReturn(gLine, gColumn, NULL); + gAllocationManager->addAllocation($$); + } + | expression ';' + { + $$ = new LLScriptExpressionStatement(gLine, gColumn, $1); + gAllocationManager->addAllocation($$); + } + | declaration ';' + { + $$ = $1; + } + | compound_statement + { + $$ = $1; + } + | IF '(' expression ')' statement %prec LOWER_THAN_ELSE + { + $$ = new LLScriptIf(gLine, gColumn, $3, $5); + $5->mAllowDeclarations = FALSE; + gAllocationManager->addAllocation($$); + } + | IF '(' expression ')' statement ELSE statement + { + $$ = new LLScriptIfElse(gLine, gColumn, $3, $5, $7); + $5->mAllowDeclarations = FALSE; + $7->mAllowDeclarations = FALSE; + gAllocationManager->addAllocation($$); + } + | FOR '(' forexpressionlist ';' expression ';' forexpressionlist ')' statement + { + $$ = new LLScriptFor(gLine, gColumn, $3, $5, $7, $9); + $9->mAllowDeclarations = FALSE; + gAllocationManager->addAllocation($$); + } + | DO statement WHILE '(' expression ')' ';' + { + $$ = new LLScriptDoWhile(gLine, gColumn, $2, $5); + $2->mAllowDeclarations = FALSE; + gAllocationManager->addAllocation($$); + } + | WHILE '(' expression ')' statement + { + $$ = new LLScriptWhile(gLine, gColumn, $3, $5); + $5->mAllowDeclarations = FALSE; + gAllocationManager->addAllocation($$); + } + ; + +declaration + : typename IDENTIFIER + { + LLScriptIdentifier *id = new LLScriptIdentifier(gLine, gColumn, $2); + gAllocationManager->addAllocation(id); + $$ = new LLScriptDeclaration(gLine, gColumn, $1, id, NULL); + gAllocationManager->addAllocation($$); + } + | typename IDENTIFIER '=' expression + { + LLScriptIdentifier *id = new LLScriptIdentifier(gLine, gColumn, $2); + gAllocationManager->addAllocation(id); + $$ = new LLScriptDeclaration(gLine, gColumn, $1, id, $4); + gAllocationManager->addAllocation($$); + } + ; + +forexpressionlist + : /* empty */ + { + $$ = NULL; + } + | nextforexpressionlist + { + $$ = $1; + } + ; + +nextforexpressionlist + : expression + { + $$ = new LLScriptForExpressionList(gLine, gColumn, $1, NULL); + gAllocationManager->addAllocation($$); + } + | expression ',' nextforexpressionlist + { + $$ = new LLScriptForExpressionList(gLine, gColumn, $1, $3); + gAllocationManager->addAllocation($$); + } + ; + +funcexpressionlist + : /* empty */ + { + $$ = NULL; + } + | nextfuncexpressionlist + { + $$ = $1; + } + ; + +nextfuncexpressionlist + : expression + { + $$ = new LLScriptFuncExpressionList(gLine, gColumn, $1, NULL); + gAllocationManager->addAllocation($$); + } + | expression ',' nextfuncexpressionlist + { + $$ = new LLScriptFuncExpressionList(gLine, gColumn, $1, $3); + gAllocationManager->addAllocation($$); + } + ; + +listexpressionlist + : /* empty */ + { + $$ = NULL; + } + | nextlistexpressionlist + { + $$ = $1; + } + ; + +nextlistexpressionlist + : expression + { + $$ = new LLScriptListExpressionList(gLine, gColumn, $1, NULL); + gAllocationManager->addAllocation($$); + } + | expression ',' nextlistexpressionlist + { + $$ = new LLScriptListExpressionList(gLine, gColumn, $1, $3); + gAllocationManager->addAllocation($$); + } + ; + +expression + : unaryexpression + { + $$ = $1; + } + | lvalue '=' expression + { + $$ = new LLScriptAssignment(gLine, gColumn, $1, $3); + gAllocationManager->addAllocation($$); + } + | lvalue ADD_ASSIGN expression + { + $$ = new LLScriptAddAssignment(gLine, gColumn, $1, $3); + gAllocationManager->addAllocation($$); + } + | lvalue SUB_ASSIGN expression + { + $$ = new LLScriptSubAssignment(gLine, gColumn, $1, $3); + gAllocationManager->addAllocation($$); + } + | lvalue MUL_ASSIGN expression + { + $$ = new LLScriptMulAssignment(gLine, gColumn, $1, $3); + gAllocationManager->addAllocation($$); + } + | lvalue DIV_ASSIGN expression + { + $$ = new LLScriptDivAssignment(gLine, gColumn, $1, $3); + gAllocationManager->addAllocation($$); + } + | lvalue MOD_ASSIGN expression + { + $$ = new LLScriptModAssignment(gLine, gColumn, $1, $3); + gAllocationManager->addAllocation($$); + } + | expression EQ expression + { + $$ = new LLScriptEquality(gLine, gColumn, $1, $3); + gAllocationManager->addAllocation($$); + } + | expression NEQ expression + { + $$ = new LLScriptNotEquals(gLine, gColumn, $1, $3); + gAllocationManager->addAllocation($$); + } + | expression LEQ expression + { + $$ = new LLScriptLessEquals(gLine, gColumn, $1, $3); + gAllocationManager->addAllocation($$); + } + | expression GEQ expression + { + $$ = new LLScriptGreaterEquals(gLine, gColumn, $1, $3); + gAllocationManager->addAllocation($$); + } + | expression '<' expression + { + $$ = new LLScriptLessThan(gLine, gColumn, $1, $3); + gAllocationManager->addAllocation($$); + } + | expression '>' expression + { + $$ = new LLScriptGreaterThan(gLine, gColumn, $1, $3); + gAllocationManager->addAllocation($$); + } + | expression '+' expression + { + $$ = new LLScriptPlus(gLine, gColumn, $1, $3); + gAllocationManager->addAllocation($$); + } + | expression '-' expression + { + $$ = new LLScriptMinus(gLine, gColumn, $1, $3); + gAllocationManager->addAllocation($$); + } + | expression '*' expression + { + $$ = new LLScriptTimes(gLine, gColumn, $1, $3); + gAllocationManager->addAllocation($$); + } + | expression '/' expression + { + $$ = new LLScriptDivide(gLine, gColumn, $1, $3); + gAllocationManager->addAllocation($$); + } + | expression '%' expression + { + $$ = new LLScriptMod(gLine, gColumn, $1, $3); + gAllocationManager->addAllocation($$); + } + | expression '&' expression + { + $$ = new LLScriptBitAnd(gLine, gColumn, $1, $3); + gAllocationManager->addAllocation($$); + } + | expression '|' expression + { + $$ = new LLScriptBitOr(gLine, gColumn, $1, $3); + gAllocationManager->addAllocation($$); + } + | expression '^' expression + { + $$ = new LLScriptBitXor(gLine, gColumn, $1, $3); + gAllocationManager->addAllocation($$); + } + | expression BOOLEAN_AND expression + { + $$ = new LLScriptBooleanAnd(gLine, gColumn, $1, $3); + gAllocationManager->addAllocation($$); + } + | expression BOOLEAN_OR expression + { + $$ = new LLScriptBooleanOr(gLine, gColumn, $1, $3); + gAllocationManager->addAllocation($$); + } + | expression SHIFT_LEFT expression + { + $$ = new LLScriptShiftLeft(gLine, gColumn, $1, $3); + gAllocationManager->addAllocation($$); + } + | expression SHIFT_RIGHT expression + { + $$ = new LLScriptShiftRight(gLine, gColumn, $1, $3); + gAllocationManager->addAllocation($$); + } + ; + +unaryexpression + : '-' expression + { + $$ = new LLScriptUnaryMinus(gLine, gColumn, $2); + gAllocationManager->addAllocation($$); + } + | '!' expression + { + $$ = new LLScriptBooleanNot(gLine, gColumn, $2); + gAllocationManager->addAllocation($$); + } + | '~' expression + { + $$ = new LLScriptBitNot(gLine, gColumn, $2); + gAllocationManager->addAllocation($$); + } + | INC_OP lvalue + { + $$ = new LLScriptPreIncrement(gLine, gColumn, $2); + gAllocationManager->addAllocation($$); + } + | DEC_OP lvalue + { + $$ = new LLScriptPreDecrement(gLine, gColumn, $2); + gAllocationManager->addAllocation($$); + } + | typecast + { + $$ = $1; + } + | unarypostfixexpression + { + $$ = $1; + } + | '(' expression ')' + { + $$ = new LLScriptParenthesis(gLine, gColumn, $2); + gAllocationManager->addAllocation($$); + } + ; + +typecast + : '(' typename ')' lvalue + { + $$ = new LLScriptTypeCast(gLine, gColumn, $2, $4); + gAllocationManager->addAllocation($$); + } + | '(' typename ')' constant + { + LLScriptConstantExpression *temp = new LLScriptConstantExpression(gLine, gColumn, $4); + gAllocationManager->addAllocation(temp); + $$ = new LLScriptTypeCast(gLine, gColumn, $2, temp); + gAllocationManager->addAllocation($$); + } + | '(' typename ')' unarypostfixexpression + { + $$ = new LLScriptTypeCast(gLine, gColumn, $2, $4); + gAllocationManager->addAllocation($$); + } + | '(' typename ')' '(' expression ')' + { + $$ = new LLScriptTypeCast(gLine, gColumn, $2, $5); + gAllocationManager->addAllocation($$); + } + ; + +unarypostfixexpression + : vector_initializer + { + $$ = $1; + } + | quaternion_initializer + { + $$ = $1; + } + | list_initializer + { + $$ = $1; + } + | lvalue + { + $$ = $1; + } + | lvalue INC_OP + { + $$ = new LLScriptPostIncrement(gLine, gColumn, $1); + gAllocationManager->addAllocation($$); + } + | lvalue DEC_OP + { + $$ = new LLScriptPostDecrement(gLine, gColumn, $1); + gAllocationManager->addAllocation($$); + } + | IDENTIFIER '(' funcexpressionlist ')' + { + LLScriptIdentifier *id = new LLScriptIdentifier(gLine, gColumn, $1); + gAllocationManager->addAllocation(id); + $$ = new LLScriptFunctionCall(gLine, gColumn, id, $3); + gAllocationManager->addAllocation($$); + } + | PRINT '(' expression ')' + { + $$ = new LLScriptPrint(gLine, gColumn, $3); + gAllocationManager->addAllocation($$); + } + | constant + { + $$ = new LLScriptConstantExpression(gLine, gColumn, $1); + gAllocationManager->addAllocation($$); + } + ; + +vector_initializer + : '<' expression ',' expression ',' expression '>' %prec INITIALIZER + { + $$ = new LLScriptVectorInitializer(gLine, gColumn, $2, $4, $6); + gAllocationManager->addAllocation($$); + } + | ZERO_VECTOR + { + LLScriptConstantFloat *cf0 = new LLScriptConstantFloat(gLine, gColumn, 0.f); + gAllocationManager->addAllocation(cf0); + LLScriptConstantExpression *sa0 = new LLScriptConstantExpression(gLine, gColumn, cf0); + gAllocationManager->addAllocation(sa0); + LLScriptConstantFloat *cf1 = new LLScriptConstantFloat(gLine, gColumn, 0.f); + gAllocationManager->addAllocation(cf1); + LLScriptConstantExpression *sa1 = new LLScriptConstantExpression(gLine, gColumn, cf1); + gAllocationManager->addAllocation(sa1); + LLScriptConstantFloat *cf2 = new LLScriptConstantFloat(gLine, gColumn, 0.f); + gAllocationManager->addAllocation(cf2); + LLScriptConstantExpression *sa2 = new LLScriptConstantExpression(gLine, gColumn, cf2); + gAllocationManager->addAllocation(sa2); + $$ = new LLScriptVectorInitializer(gLine, gColumn, sa0, sa1, sa2); + gAllocationManager->addAllocation($$); + } + ; + +quaternion_initializer + : '<' expression ',' expression ',' expression ',' expression '>' %prec INITIALIZER + { + $$ = new LLScriptQuaternionInitializer(gLine, gColumn, $2, $4, $6, $8); + gAllocationManager->addAllocation($$); + } + | ZERO_ROTATION + { + LLScriptConstantFloat *cf0 = new LLScriptConstantFloat(gLine, gColumn, 0.f); + gAllocationManager->addAllocation(cf0); + LLScriptConstantExpression *sa0 = new LLScriptConstantExpression(gLine, gColumn, cf0); + gAllocationManager->addAllocation(sa0); + LLScriptConstantFloat *cf1 = new LLScriptConstantFloat(gLine, gColumn, 0.f); + gAllocationManager->addAllocation(cf1); + LLScriptConstantExpression *sa1 = new LLScriptConstantExpression(gLine, gColumn, cf1); + gAllocationManager->addAllocation(sa1); + LLScriptConstantFloat *cf2 = new LLScriptConstantFloat(gLine, gColumn, 0.f); + gAllocationManager->addAllocation(cf2); + LLScriptConstantExpression *sa2 = new LLScriptConstantExpression(gLine, gColumn, cf2); + gAllocationManager->addAllocation(sa2); + LLScriptConstantFloat *cf3 = new LLScriptConstantFloat(gLine, gColumn, 1.f); + gAllocationManager->addAllocation(cf3); + LLScriptConstantExpression *sa3 = new LLScriptConstantExpression(gLine, gColumn, cf3); + gAllocationManager->addAllocation(sa3); + $$ = new LLScriptQuaternionInitializer(gLine, gColumn, sa0, sa1, sa2, sa3); + gAllocationManager->addAllocation($$); + } + ; + +list_initializer + : '[' listexpressionlist ']' %prec INITIALIZER + { + $$ = new LLScriptListInitializer(gLine, gColumn, $2); + gAllocationManager->addAllocation($$); + } + ; + +lvalue + : IDENTIFIER + { + LLScriptIdentifier *id = new LLScriptIdentifier(gLine, gColumn, $1); + gAllocationManager->addAllocation(id); + $$ = new LLScriptLValue(gLine, gColumn, id, NULL); + gAllocationManager->addAllocation($$); + } + | IDENTIFIER PERIOD IDENTIFIER + { + LLScriptIdentifier *id = new LLScriptIdentifier(gLine, gColumn, $1); + gAllocationManager->addAllocation(id); + LLScriptIdentifier *ac = new LLScriptIdentifier(gLine, gColumn, $3); + gAllocationManager->addAllocation(id); + $$ = new LLScriptLValue(gLine, gColumn, id, ac); + gAllocationManager->addAllocation($$); + } + ; + +%% |