From 98560b4ec0a25e3d0854a32bd23a034fa558d6ba Mon Sep 17 00:00:00 2001 From: David Walter Seikel Date: Tue, 17 Jan 2012 01:50:03 +1000 Subject: Bit of clean up and commenting. --- LuaSL/src/LuaSL_lemon_yaccer.y | 86 ++++++++++++++++++++++++++++-------------- 1 file changed, 58 insertions(+), 28 deletions(-) (limited to 'LuaSL') diff --git a/LuaSL/src/LuaSL_lemon_yaccer.y b/LuaSL/src/LuaSL_lemon_yaccer.y index 06c534d..d24f1a9 100644 --- a/LuaSL/src/LuaSL_lemon_yaccer.y +++ b/LuaSL/src/LuaSL_lemon_yaccer.y @@ -11,34 +11,53 @@ %token_destructor {burnLeaf($$);} %default_destructor {burnLeaf($$);} +// The start symbol, just coz we need one. +// Lemon does not like the start symbol to be on the RHS, so give it a dummy start symbol. -program ::= script LSL_SCRIPT(A). { if (NULL != A) A->left = param->ast; param->ast = A; } // Lemon does not like the start symbol to be on the RHS, so give it a dummy one. +program ::= script LSL_SCRIPT(A). { if (NULL != A) A->left = param->ast; param->ast = A; } + +// Various forms of "space". The lexer takes care of them for us. %nonassoc LSL_SPACE LSL_COMMENT LSL_COMMENT_LINE LSL_UNKNOWN. +// Basic script structure. + %nonassoc LSL_SCRIPT. script ::= script state. script ::= script function. script ::= script statement(A). { if (NULL != A) A->left = param->ast; param->ast = A; } script ::= . +// State definitions. + +%nonassoc LSL_BLOCK_OPEN LSL_BLOCK_CLOSE LSL_STATE. stateBlock ::= LSL_BLOCK_OPEN functionList LSL_BLOCK_CLOSE. state ::= LSL_IDENTIFIER stateBlock. -%nonassoc LSL_PARAMETER LSL_FUNCTION LSL_STATE. +// Function definitions. + +%nonassoc LSL_PARAMETER LSL_FUNCTION. +functionList ::= functionList function. +functionList ::= . + parameter ::= type LSL_IDENTIFIER. parameterList ::= parameterList LSL_COMMA parameter. parameterList ::= parameter. parameterList ::= . -function ::= LSL_IDENTIFIER LSL_PARENTHESIS_OPEN parameterList LSL_PARENTHESIS_CLOSE funcBlock. +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. function ::= type LSL_IDENTIFIER LSL_PARENTHESIS_OPEN parameterList LSL_PARENTHESIS_CLOSE funcBlock. -functionList ::= functionList function. -functionList ::= . -%nonassoc LSL_BLOCK_OPEN LSL_BLOCK_CLOSE. -funcBlock ::= LSL_BLOCK_OPEN statementList LSL_BLOCK_CLOSE. +// Blocks. + block ::= funcBlock. block ::= statement. +funcBlock ::= LSL_BLOCK_OPEN statementList LSL_BLOCK_CLOSE. + +// Various forms of statement. + +%nonassoc LSL_STATEMENT. +statementList ::= statementList statement. +statementList ::= . %nonassoc LSL_DO LSL_FOR LSL_ELSE_IF LSL_IF LSL_JUMP LSL_RETURN LSL_STATE_CHANGE LSL_WHILE. %nonassoc LSL_ELSE. @@ -47,25 +66,25 @@ statement ::= LSL_FOR LSL_PARENTHESIS_OPEN expr LSL_STATEMENT expr LSL_STATEMENT ifBlock ::= ifBlock LSL_ELSE block. ifBlock ::= block. -statement ::= LSL_IF LSL_PARENTHESIS_OPEN expr LSL_PARENTHESIS_CLOSE ifBlock. //[LSL_ELSE] +statement ::= LSL_IF LSL_PARENTHESIS_OPEN expr LSL_PARENTHESIS_CLOSE ifBlock. [LSL_ELSE] // The [LSL_ELSE] part causes a conflict. statement ::= LSL_JUMP LSL_IDENTIFIER LSL_STATEMENT. statement ::= LSL_RETURN expr LSL_STATEMENT. statement ::= LSL_RETURN LSL_STATEMENT. statement ::= LSL_STATE_CHANGE LSL_IDENTIFIER LSL_STATEMENT. -statement ::= LSL_WHILE LSL_WHILE LSL_PARENTHESIS_OPEN expr LSL_PARENTHESIS_CLOSE block. +statement ::= LSL_WHILE LSL_PARENTHESIS_OPEN expr LSL_PARENTHESIS_CLOSE block. %nonassoc LSL_LABEL. -target ::= LSL_LABEL LSL_IDENTIFIER LSL_STATEMENT. +statement ::= LSL_LABEL LSL_IDENTIFIER LSL_STATEMENT. -%nonassoc LSL_STATEMENT. -statement ::= target LSL_STATEMENT. -statement ::= type LSL_IDENTIFIER LSL_ASSIGNMENT_PLAIN expr LSL_STATEMENT. -statement ::= type LSL_IDENTIFIER LSL_STATEMENT. +// This might be bogus, or might be valid LSL, but it let us test the expression parser by evaluating them. statement(A) ::= expr(B) LSL_STATEMENT(D). { A = addStatement(D, LSL_EXPRESSION, B); } -statementList ::= statementList statement. -statementList ::= . +// Various forms of expression. + +exprList ::= exprList LSL_COMMA expr. +exprList ::= expr. +exprList ::= . %right LSL_BOOL_AND. expr(A) ::= expr(B) LSL_BOOL_AND(C) expr(D). { A = addOperation(B, C, D); } @@ -103,6 +122,8 @@ expr(A) ::= LSL_BIT_NOT(B) expr(C). { A = addOperation(NULL, B, C); } expr(A) ::= LSL_BOOL_NOT(B) expr(C). { A = addOperation(NULL, B, C); } expr(A) ::= LSL_SUBTRACT(B) expr(C). [LSL_NEGATION] { A = addOperation(NULL, B, C); } +// Types, typecasts, and expression reordering. + %right LSL_TYPECAST_OPEN LSL_TYPECAST_CLOSE. %nonassoc LSL_TYPE_FLOAT LSL_TYPE_INTEGER LSL_TYPE_KEY LSL_TYPE_LIST LSL_TYPE_ROTATION LSL_TYPE_STRING LSL_TYPE_VECTOR. type ::= LSL_TYPE_FLOAT. @@ -120,9 +141,11 @@ type ::= LSL_TYPE_VECTOR. expr(A) ::= LSL_PARENTHESIS_OPEN(B) expr(C) LSL_PARENTHESIS_CLOSE(D). { A = addParenthesis(B, C, D); } expr(A) ::= LSL_PARENTHESIS_OPEN(B) type(C) LSL_PARENTHESIS_CLOSE(D) expr(E). { A = addTypecast(B, C, D, E); } -%right LSL_DOT LSL_IDENTIFIER. -identifier ::= identifier LSL_DOT LSL_IDENTIFIER. -identifier ::= LSL_IDENTIFIER. +// Function call. + +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. + +// Variables and dealing with them. expr ::= identifier. @@ -135,12 +158,24 @@ expr ::= identifier LSL_ASSIGNMENT_MODULO expr. expr ::= identifier LSL_ASSIGNMENT_DIVIDE expr. expr ::= identifier LSL_ASSIGNMENT_PLAIN expr. +// Hmm think this can have commas seperating the assignment parts. +statement ::= type LSL_IDENTIFIER LSL_ASSIGNMENT_PLAIN expr LSL_STATEMENT. +statement ::= type LSL_IDENTIFIER LSL_STATEMENT. + +%right LSL_DOT LSL_IDENTIFIER. +identifier ::= identifier LSL_DOT LSL_IDENTIFIER. +identifier ::= LSL_IDENTIFIER. + %right LSL_DECREMENT_PRE LSL_INCREMENT_PRE LSL_DECREMENT_POST LSL_INCREMENT_POST. expr ::= identifier LSL_DECREMENT_PRE. expr ::= identifier LSL_INCREMENT_PRE. expr ::= LSL_DECREMENT_PRE identifier. expr ::= LSL_INCREMENT_PRE identifier. +%nonassoc LSL_COMMA. + +// Values. + %nonassoc LSL_FLOAT. expr(A) ::= LSL_FLOAT(B). { B->basicType = OT_float; A = B; } %nonassoc LSL_INTEGER. @@ -148,22 +183,17 @@ expr(A) ::= LSL_INTEGER(B). { B->basicType = OT_integer; A = B; } %nonassoc LSL_KEY. expr(A) ::= LSL_KEY(B). { B->basicType = OT_key; A = B; } %nonassoc LSL_LIST. -expr ::= LSL_BRACKET_OPEN exprList LSL_BRACKET_CLOSE. +expr ::= LSL_BRACKET_OPEN exprList LSL_BRACKET_CLOSE. [LSL_BRACKET_OPEN] %nonassoc LSL_ROTATION. -expr ::= LSL_ANGLE_OPEN expr LSL_COMMA expr LSL_COMMA expr LSL_COMMA expr LSL_ANGLE_CLOSE. +expr ::= LSL_ANGLE_OPEN expr LSL_COMMA expr LSL_COMMA expr LSL_COMMA expr LSL_ANGLE_CLOSE. [LSL_ANGLE_OPEN] %nonassoc LSL_STRING. expr(A) ::= LSL_STRING(B). { B->basicType = OT_string; A = B; } %nonassoc LSL_VECTOR. expr ::= LSL_VECTOR. -expr ::= LSL_ANGLE_OPEN expr LSL_COMMA expr LSL_COMMA expr LSL_ANGLE_CLOSE. +expr ::= LSL_ANGLE_OPEN expr LSL_COMMA expr LSL_COMMA expr LSL_ANGLE_CLOSE. [LSL_ANGLE_OPEN] -%nonassoc LSL_COMMA. - -exprList ::= exprList LSL_COMMA expr. -exprList ::= expr. -exprList ::= . -expr ::= LSL_IDENTIFIER LSL_PARENTHESIS_OPEN exprList LSL_PARENTHESIS_CLOSE. +// Parser callbacks. %parse_accept {printf("Parsing complete.\n");} -- cgit v1.1