diff options
author | David Walter Seikel | 2012-01-17 10:29:48 +1000 |
---|---|---|
committer | David Walter Seikel | 2012-01-17 10:29:48 +1000 |
commit | dc7af57b02a95b67fa4dc556861d327a020428bc (patch) | |
tree | 4cf32c36e25953ef8c21f3f50e39e9d58c260108 /LuaSL/src/LuaSL_lemon_yaccer.y | |
parent | Disable the file compare for now, got lots to add before it will work again. (diff) | |
download | SledjHamr-dc7af57b02a95b67fa4dc556861d327a020428bc.zip SledjHamr-dc7af57b02a95b67fa4dc556861d327a020428bc.tar.gz SledjHamr-dc7af57b02a95b67fa4dc556861d327a020428bc.tar.bz2 SledjHamr-dc7af57b02a95b67fa4dc556861d327a020428bc.tar.xz |
Parser now understands state, function, and variable derlarations. Including scope. :-P
Diffstat (limited to 'LuaSL/src/LuaSL_lemon_yaccer.y')
-rw-r--r-- | LuaSL/src/LuaSL_lemon_yaccer.y | 51 |
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. | ||
17 | program ::= script LSL_SCRIPT(A). { if (NULL != A) A->left = param->ast; param->ast = A; } | 17 | program ::= 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. |
26 | script ::= script state. | 26 | script ::= script state. |
27 | script ::= script function. | 27 | script ::= script function(A). { if (NULL != A) A->left = param->ast; param->ast = A; } |
28 | script ::= script statement(A). { if (NULL != A) A->left = param->ast; param->ast = A; } | 28 | script ::= script statement(A). { if (NULL != A) A->left = param->ast; param->ast = A; } |
29 | script ::= . | 29 | script ::= . |
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. |
34 | stateBlock ::= LSL_BLOCK_OPEN functionList LSL_BLOCK_CLOSE. | 34 | stateBlock ::= LSL_BLOCK_OPEN functionList LSL_BLOCK_CLOSE. |
35 | state ::= LSL_IDENTIFIER stateBlock. | 35 | state(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. |
40 | functionList ::= functionList function. | 40 | functionList ::= functionList function. |
41 | functionList ::= . | 41 | functionList ::= . |
42 | 42 | ||
43 | parameter ::= type LSL_IDENTIFIER. | 43 | parameterList(A) ::= parameterList(B) LSL_COMMA(C) parameter(D). { A = collectParameters(param, B, C, D); } |
44 | parameterList ::= parameterList LSL_COMMA parameter. | 44 | parameterList(A) ::= parameter(D). { A = collectParameters(param, NULL, NULL, D); } |
45 | parameterList ::= parameter. | 45 | parameterList(A) ::= . { A = collectParameters(param, NULL, NULL, NULL); } |
46 | parameterList ::= . | 46 | parameter(A) ::= type(B) LSL_IDENTIFIER(C). { A = addParameter(param, B, C); } |
47 | function ::= 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. |
48 | function ::= type LSL_IDENTIFIER LSL_PARENTHESIS_OPEN parameterList LSL_PARENTHESIS_CLOSE funcBlock. | 48 | function(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); } |
49 | function(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 | ||
52 | block ::= funcBlock. | 53 | block(A) ::= funcBlock(B). { A = B; } |
53 | block ::= statement. | 54 | block(A) ::= statement(B). { A = B; } |
54 | funcBlock ::= LSL_BLOCK_OPEN statementList LSL_BLOCK_CLOSE. | 55 | funcBlock ::= 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 | ||
67 | ifBlock ::= ifBlock LSL_ELSE block. | 68 | ifBlock ::= ifBlock LSL_ELSE block. |
68 | ifBlock ::= block. | 69 | ifBlock ::= block. |
69 | statement ::= 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. |
71 | statement ::= LSL_IF LSL_PARENTHESIS_OPEN expr LSL_PARENTHESIS_CLOSE ifBlock. [LSL_ELSE] | ||
70 | 72 | ||
71 | statement ::= LSL_JUMP LSL_IDENTIFIER LSL_STATEMENT. | 73 | statement ::= LSL_JUMP LSL_IDENTIFIER LSL_STATEMENT. |
72 | statement ::= LSL_RETURN expr LSL_STATEMENT. | 74 | statement ::= 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. |
129 | type ::= LSL_TYPE_FLOAT. | 131 | type(A) ::= LSL_TYPE_FLOAT(B). { B->basicType = OT_float; A = B; } |
130 | type ::= LSL_TYPE_INTEGER. | 132 | type(A) ::= LSL_TYPE_INTEGER(B). { B->basicType = OT_integer; A = B; } |
131 | type ::= LSL_TYPE_KEY. | 133 | type(A) ::= LSL_TYPE_KEY(B). { B->basicType = OT_key; A = B; } |
132 | type ::= LSL_TYPE_LIST. | 134 | type(A) ::= LSL_TYPE_LIST(B). { B->basicType = OT_list; A = B; } |
133 | type ::= LSL_TYPE_ROTATION. | 135 | type(A) ::= LSL_TYPE_ROTATION(B). { B->basicType = OT_rotation; A = B; } |
134 | type ::= LSL_TYPE_STRING. | 136 | type(A) ::= LSL_TYPE_STRING(B). { B->basicType = OT_string; A = B; } |
135 | type ::= LSL_TYPE_VECTOR. | 137 | type(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 | ||
141 | expr(A) ::= LSL_PARENTHESIS_OPEN(B) expr(C) LSL_PARENTHESIS_CLOSE(D). { A = addParenthesis(B, C, D); } | 143 | expr(A) ::= LSL_PARENTHESIS_OPEN(B) expr(C) LSL_PARENTHESIS_CLOSE(D). { A = addParenthesis(B, C, LSL_EXPRESSION, D); } |
142 | expr(A) ::= LSL_PARENTHESIS_OPEN(B) type(C) LSL_PARENTHESIS_CLOSE(D) expr(E). { A = addTypecast(B, C, D, E); } | 144 | expr(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 | ||
146 | expr ::= 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. |
149 | expr ::= 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. | |||
159 | expr ::= identifier LSL_ASSIGNMENT_PLAIN expr. | 162 | expr ::= 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. |
162 | statement ::= type LSL_IDENTIFIER LSL_ASSIGNMENT_PLAIN expr LSL_STATEMENT. | 165 | statement(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)); } |
163 | statement ::= type LSL_IDENTIFIER LSL_STATEMENT. | 166 | statement(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. |
166 | identifier ::= identifier LSL_DOT LSL_IDENTIFIER. | 169 | identifier ::= identifier LSL_DOT LSL_IDENTIFIER. |