aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/LuaSL/src/LuaSL_lemon_yaccer.y
diff options
context:
space:
mode:
Diffstat (limited to 'LuaSL/src/LuaSL_lemon_yaccer.y')
-rw-r--r--LuaSL/src/LuaSL_lemon_yaccer.y51
1 files changed, 27 insertions, 24 deletions
diff --git a/LuaSL/src/LuaSL_lemon_yaccer.y b/LuaSL/src/LuaSL_lemon_yaccer.y
index d24f1a9..f79c228 100644
--- a/LuaSL/src/LuaSL_lemon_yaccer.y
+++ b/LuaSL/src/LuaSL_lemon_yaccer.y
@@ -12,8 +12,8 @@
12%default_destructor {burnLeaf($$);} 12%default_destructor {burnLeaf($$);}
13 13
14// The start symbol, just coz we need one. 14// The start symbol, just coz we need one.
15// Lemon does not like the start symbol to be on the RHS, so give it a dummy start symbol.
16 15
16// Lemon does not like the start symbol to be on the RHS, so give it a dummy start symbol.
17program ::= script LSL_SCRIPT(A). { if (NULL != A) A->left = param->ast; param->ast = A; } 17program ::= script LSL_SCRIPT(A). { if (NULL != A) A->left = param->ast; param->ast = A; }
18 18
19// Various forms of "space". The lexer takes care of them for us. 19// Various forms of "space". The lexer takes care of them for us.
@@ -24,7 +24,7 @@ program ::= script LSL_SCRIPT(A). { if (NULL != A) A->left = param->ast; p
24 24
25%nonassoc LSL_SCRIPT. 25%nonassoc LSL_SCRIPT.
26script ::= script state. 26script ::= script state.
27script ::= script function. 27script ::= script function(A). { if (NULL != A) A->left = param->ast; param->ast = A; }
28script ::= script statement(A). { if (NULL != A) A->left = param->ast; param->ast = A; } 28script ::= script statement(A). { if (NULL != A) A->left = param->ast; param->ast = A; }
29script ::= . 29script ::= .
30 30
@@ -32,25 +32,26 @@ script ::= .
32 32
33%nonassoc LSL_BLOCK_OPEN LSL_BLOCK_CLOSE LSL_STATE. 33%nonassoc LSL_BLOCK_OPEN LSL_BLOCK_CLOSE LSL_STATE.
34stateBlock ::= LSL_BLOCK_OPEN functionList LSL_BLOCK_CLOSE. 34stateBlock ::= LSL_BLOCK_OPEN functionList LSL_BLOCK_CLOSE.
35state ::= LSL_IDENTIFIER stateBlock. 35state(S) ::= LSL_IDENTIFIER(I) stateBlock(B). { S = addState(param, I->value.stringValue, B); }
36 36
37// Function definitions. 37// Function definitions.
38 38
39%nonassoc LSL_PARAMETER LSL_FUNCTION. 39%nonassoc LSL_PARAMETER LSL_PARAMETER_LIST LSL_FUNCTION.
40functionList ::= functionList function. 40functionList ::= functionList function.
41functionList ::= . 41functionList ::= .
42 42
43parameter ::= type LSL_IDENTIFIER. 43parameterList(A) ::= parameterList(B) LSL_COMMA(C) parameter(D). { A = collectParameters(param, B, C, D); }
44parameterList ::= parameterList LSL_COMMA parameter. 44parameterList(A) ::= parameter(D). { A = collectParameters(param, NULL, NULL, D); }
45parameterList ::= parameter. 45parameterList(A) ::= . { A = collectParameters(param, NULL, NULL, NULL); }
46parameterList ::= . 46parameter(A) ::= type(B) LSL_IDENTIFIER(C). { A = addParameter(param, B, C); }
47function ::= LSL_IDENTIFIER LSL_PARENTHESIS_OPEN parameterList LSL_PARENTHESIS_CLOSE funcBlock. // Causes a conflict when it's an empty parameterList with calling the same type of function. 47// Causes a conflict when it's an empty parameterList with calling the same type of function.
48function ::= type LSL_IDENTIFIER LSL_PARENTHESIS_OPEN parameterList LSL_PARENTHESIS_CLOSE funcBlock. 48function(A) ::= LSL_IDENTIFIER(C) LSL_PARENTHESIS_OPEN(D) parameterList(E) LSL_PARENTHESIS_CLOSE(F) funcBlock(G). { A = addFunction(param, NULL, C, D, E, F, G); }
49function(A) ::= type(B) LSL_IDENTIFIER(C) LSL_PARENTHESIS_OPEN(D) parameterList(E) LSL_PARENTHESIS_CLOSE(F) funcBlock(G). { A = addFunction(param, B, C, D, E, F, G); }
49 50
50// Blocks. 51// Blocks.
51 52
52block ::= funcBlock. 53block(A) ::= funcBlock(B). { A = B; }
53block ::= statement. 54block(A) ::= statement(B). { A = B; }
54funcBlock ::= LSL_BLOCK_OPEN statementList LSL_BLOCK_CLOSE. 55funcBlock ::= LSL_BLOCK_OPEN statementList LSL_BLOCK_CLOSE.
55 56
56// Various forms of statement. 57// Various forms of statement.
@@ -66,7 +67,8 @@ statement ::= LSL_FOR LSL_PARENTHESIS_OPEN expr LSL_STATEMENT expr LSL_STATEMENT
66 67
67ifBlock ::= ifBlock LSL_ELSE block. 68ifBlock ::= ifBlock LSL_ELSE block.
68ifBlock ::= block. 69ifBlock ::= block.
69statement ::= LSL_IF LSL_PARENTHESIS_OPEN expr LSL_PARENTHESIS_CLOSE ifBlock. [LSL_ELSE] // The [LSL_ELSE] part causes a conflict. 70// The [LSL_ELSE] part causes a conflict.
71statement ::= LSL_IF LSL_PARENTHESIS_OPEN expr LSL_PARENTHESIS_CLOSE ifBlock. [LSL_ELSE]
70 72
71statement ::= LSL_JUMP LSL_IDENTIFIER LSL_STATEMENT. 73statement ::= LSL_JUMP LSL_IDENTIFIER LSL_STATEMENT.
72statement ::= LSL_RETURN expr LSL_STATEMENT. 74statement ::= LSL_RETURN expr LSL_STATEMENT.
@@ -126,24 +128,25 @@ expr(A) ::= LSL_SUBTRACT(B) expr(C). [LSL_NEGATION] { A = addOperation(NULL, B
126 128
127%right LSL_TYPECAST_OPEN LSL_TYPECAST_CLOSE. 129%right LSL_TYPECAST_OPEN LSL_TYPECAST_CLOSE.
128%nonassoc LSL_TYPE_FLOAT LSL_TYPE_INTEGER LSL_TYPE_KEY LSL_TYPE_LIST LSL_TYPE_ROTATION LSL_TYPE_STRING LSL_TYPE_VECTOR. 130%nonassoc LSL_TYPE_FLOAT LSL_TYPE_INTEGER LSL_TYPE_KEY LSL_TYPE_LIST LSL_TYPE_ROTATION LSL_TYPE_STRING LSL_TYPE_VECTOR.
129type ::= LSL_TYPE_FLOAT. 131type(A) ::= LSL_TYPE_FLOAT(B). { B->basicType = OT_float; A = B; }
130type ::= LSL_TYPE_INTEGER. 132type(A) ::= LSL_TYPE_INTEGER(B). { B->basicType = OT_integer; A = B; }
131type ::= LSL_TYPE_KEY. 133type(A) ::= LSL_TYPE_KEY(B). { B->basicType = OT_key; A = B; }
132type ::= LSL_TYPE_LIST. 134type(A) ::= LSL_TYPE_LIST(B). { B->basicType = OT_list; A = B; }
133type ::= LSL_TYPE_ROTATION. 135type(A) ::= LSL_TYPE_ROTATION(B). { B->basicType = OT_rotation; A = B; }
134type ::= LSL_TYPE_STRING. 136type(A) ::= LSL_TYPE_STRING(B). { B->basicType = OT_string; A = B; }
135type ::= LSL_TYPE_VECTOR. 137type(A) ::= LSL_TYPE_VECTOR(B). { B->basicType = OT_vector; A = B; }
136 138
137%left LSL_ANGLE_OPEN LSL_ANGLE_CLOSE. 139%left LSL_ANGLE_OPEN LSL_ANGLE_CLOSE.
138%nonassoc LSL_BRACKET_OPEN LSL_BRACKET_CLOSE. 140%nonassoc LSL_BRACKET_OPEN LSL_BRACKET_CLOSE.
139%nonassoc LSL_PARENTHESIS_OPEN LSL_PARENTHESIS_CLOSE LSL_EXPRESSION. 141%nonassoc LSL_PARENTHESIS_OPEN LSL_PARENTHESIS_CLOSE LSL_EXPRESSION.
140 142
141expr(A) ::= LSL_PARENTHESIS_OPEN(B) expr(C) LSL_PARENTHESIS_CLOSE(D). { A = addParenthesis(B, C, D); } 143expr(A) ::= LSL_PARENTHESIS_OPEN(B) expr(C) LSL_PARENTHESIS_CLOSE(D). { A = addParenthesis(B, C, LSL_EXPRESSION, D); }
142expr(A) ::= LSL_PARENTHESIS_OPEN(B) type(C) LSL_PARENTHESIS_CLOSE(D) expr(E). { A = addTypecast(B, C, D, E); } 144expr(A) ::= LSL_PARENTHESIS_OPEN(B) type(C) LSL_PARENTHESIS_CLOSE(D) expr(E). { A = addTypecast(B, C, D, E); }
143 145
144// Function call. 146// Function call.
145 147
146expr ::= LSL_IDENTIFIER LSL_PARENTHESIS_OPEN exprList LSL_PARENTHESIS_CLOSE. // Casuses a conflict when exprList is empty with a function definition with no type and no parameters. 148// Causes a conflict when exprList is empty with a function definition with no type and no parameters.
149expr ::= LSL_IDENTIFIER LSL_PARENTHESIS_OPEN exprList LSL_PARENTHESIS_CLOSE.
147 150
148// Variables and dealing with them. 151// Variables and dealing with them.
149 152
@@ -159,8 +162,8 @@ expr ::= identifier LSL_ASSIGNMENT_DIVIDE expr.
159expr ::= identifier LSL_ASSIGNMENT_PLAIN expr. 162expr ::= identifier LSL_ASSIGNMENT_PLAIN expr.
160 163
161// Hmm think this can have commas seperating the assignment parts. 164// Hmm think this can have commas seperating the assignment parts.
162statement ::= type LSL_IDENTIFIER LSL_ASSIGNMENT_PLAIN expr LSL_STATEMENT. 165statement(A) ::= type(B) LSL_IDENTIFIER(C) LSL_ASSIGNMENT_PLAIN(D) expr(E) LSL_STATEMENT(F). { A = addStatement(F, LSL_IDENTIFIER, addVariable(param, B, C, D, E)); }
163statement ::= type LSL_IDENTIFIER LSL_STATEMENT. 166statement(A) ::= type(B) LSL_IDENTIFIER(C) LSL_STATEMENT(F). { A = addStatement(F, LSL_IDENTIFIER, addVariable(param, B, C, NULL, NULL)); }
164 167
165%right LSL_DOT LSL_IDENTIFIER. 168%right LSL_DOT LSL_IDENTIFIER.
166identifier ::= identifier LSL_DOT LSL_IDENTIFIER. 169identifier ::= identifier LSL_DOT LSL_IDENTIFIER.