Files
SingularityViewer/indra/lscript/lscript_compile/indra.y

1799 lines
49 KiB
Plaintext

%{
#include "linden_common.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 LL_WINDOWS
#pragma warning (disable : 4702) // warning C4702: unreachable code
#pragma warning( disable : 4065 ) // warning: switch statement contains 'default' but no 'case' labels
#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
%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 HTTP_REQUEST
%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
%token TOUCH_INVALID_VECTOR
%token TOUCH_INVALID_TEXCOORD
%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 <ival> integer_constant
%type <fval> fp_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> http_request
%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($$);
}
| fp_constant
{
$$ = new LLScriptConstantFloat(gLine, gColumn, $1);
gAllocationManager->addAllocation($$);
}
| STRING_CONSTANT
{
$$ = new LLScriptConstantString(gLine, gColumn, $1);
gAllocationManager->addAllocation($$);
}
;
fp_constant
: FP_CONSTANT
{
$$ = $1;
}
| '-' FP_CONSTANT
{
$$ = -$2;
}
;
integer_constant
: INTEGER_CONSTANT
{
$$ = $1;
}
| INTEGER_TRUE
{
$$ = $1;
}
| INTEGER_FALSE
{
$$ = $1;
}
| '-' INTEGER_CONSTANT
{
$$ = -$2;
}
;
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($$);
}
| TOUCH_INVALID_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($$);
}
| TOUCH_INVALID_TEXCOORD
{
LLScriptConstantFloat *cf0 = new LLScriptConstantFloat(gLine, gColumn, -1.f);
gAllocationManager->addAllocation(cf0);
LLScriptSAConstant *sa0 = new LLScriptSAConstant(gLine, gColumn, cf0);
gAllocationManager->addAllocation(sa0);
LLScriptConstantFloat *cf1 = new LLScriptConstantFloat(gLine, gColumn, -1.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($$);
}
| http_request 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($$);
}
;
http_request
: HTTP_REQUEST '(' LLKEY IDENTIFIER ',' STRING 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);
$$ = new LLScriptHTTPRequestEvent(gLine, gColumn, id1, id2, id3);
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($$);
}
| TOUCH_INVALID_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($$);
}
| TOUCH_INVALID_TEXCOORD
{
LLScriptConstantFloat *cf0 = new LLScriptConstantFloat(gLine, gColumn, -1.f);
gAllocationManager->addAllocation(cf0);
LLScriptConstantExpression *sa0 = new LLScriptConstantExpression(gLine, gColumn, cf0);
gAllocationManager->addAllocation(sa0);
LLScriptConstantFloat *cf1 = new LLScriptConstantFloat(gLine, gColumn, -1.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($$);
}
;
%%