From cb95506e6aa887d1f810759f626e3934b6a87201 Mon Sep 17 00:00:00 2001 From: David Walter Seikel Date: Mon, 16 Jan 2012 00:54:18 +1000 Subject: Fill out the rest of theparser symbols, and partiallyimplement typecasting. --- LuaSL/src/LuaSL_LSL_tree.c | 81 +++++++++++++++++++++++++++--------------- LuaSL/src/LuaSL_LSL_tree.h | 1 + LuaSL/src/LuaSL_lemon_yaccer.y | 32 ++++++++++++----- 3 files changed, 76 insertions(+), 38 deletions(-) diff --git a/LuaSL/src/LuaSL_LSL_tree.c b/LuaSL/src/LuaSL_LSL_tree.c index c5a9405..dc0a4c7 100644 --- a/LuaSL/src/LuaSL_LSL_tree.c +++ b/LuaSL/src/LuaSL_LSL_tree.c @@ -41,26 +41,26 @@ LSL_Token LSL_Tokens[] = {LSL_LESS_THAN, ST_COMPARISON, "<", LSL_RIGHT2LEFT, NULL, NULL, evaluateOperationToken}, {LSL_RIGHT_SHIFT, ST_BITWISE, ">>", LSL_LEFT2RIGHT, NULL, NULL, evaluateOperationToken}, {LSL_LEFT_SHIFT, ST_BITWISE, "<<", LSL_LEFT2RIGHT, NULL, NULL, evaluateOperationToken}, -// {LSL_CONCATENATE, ST_ADD, "+", LSL_LEFT2RIGHT, NULL, NULL, evaluateOperationToken}, + {LSL_CONCATENATE, ST_ADD, "+", LSL_LEFT2RIGHT, NULL, NULL, evaluateOperationToken}, {LSL_ADD, ST_ADD, "+", LSL_LEFT2RIGHT, NULL, NULL, evaluateOperationToken}, {LSL_SUBTRACT, ST_SUBTRACT, "-", LSL_LEFT2RIGHT, NULL, NULL, evaluateOperationToken}, -// {LSL_CROSS_PRODUCT, ST_NONE, "%", LSL_LEFT2RIGHT, NULL, NULL, evaluateOperationToken}, -// {LSL_DOT_PRODUCT, ST_NONE, "*", LSL_LEFT2RIGHT, NULL, NULL, evaluateOperationToken}, + {LSL_CROSS_PRODUCT, ST_NONE, "%", LSL_LEFT2RIGHT, NULL, NULL, evaluateOperationToken}, + {LSL_DOT_PRODUCT, ST_NONE, "*", LSL_LEFT2RIGHT, NULL, NULL, evaluateOperationToken}, {LSL_MULTIPLY, ST_MULTIPLY, "*", LSL_LEFT2RIGHT, NULL, NULL, evaluateOperationToken}, {LSL_MODULO, ST_MODULO, "%", LSL_LEFT2RIGHT, NULL, NULL, evaluateOperationToken}, {LSL_DIVIDE, ST_MULTIPLY, "/", LSL_LEFT2RIGHT, NULL, NULL, evaluateOperationToken}, {LSL_NEGATION, ST_NEGATE, "-", LSL_RIGHT2LEFT | LSL_UNARY, NULL, NULL, evaluateOperationToken}, {LSL_BOOL_NOT, ST_BOOL_NOT, "!", LSL_RIGHT2LEFT | LSL_UNARY, NULL, NULL, evaluateOperationToken}, {LSL_BIT_NOT, ST_BIT_NOT, "~", LSL_RIGHT2LEFT | LSL_UNARY, NULL, NULL, evaluateOperationToken}, -// {LSL_TYPECAST_CLOSE, ST_NONE, ")", LSL_RIGHT2LEFT | LSL_UNARY, NULL, NULL, evaluateOperationToken}, -// {LSL_TYPECAST_OPEN, ST_NONE, "(", LSL_RIGHT2LEFT | LSL_UNARY, NULL, NULL, evaluateOperationToken}, - {LSL_ANGLE_CLOSE, ST_NONE, ">", LSL_LEFT2RIGHT | LSL_CREATION, NULL, NULL, evaluateOperationToken}, + {LSL_TYPECAST_CLOSE, ST_NONE, ")", LSL_RIGHT2LEFT | LSL_UNARY, NULL, NULL, evaluateNoToken}, + {LSL_TYPECAST_OPEN, ST_NONE, "(", LSL_RIGHT2LEFT | LSL_UNARY, NULL, NULL, evaluateOperationToken}, + {LSL_ANGLE_CLOSE, ST_NONE, ">", LSL_LEFT2RIGHT | LSL_CREATION, NULL, NULL, evaluateNoToken}, {LSL_ANGLE_OPEN, ST_NONE, "<", LSL_LEFT2RIGHT | LSL_CREATION, NULL, NULL, evaluateOperationToken}, - {LSL_BRACKET_CLOSE, ST_NONE, "]", LSL_INNER2OUTER | LSL_CREATION, NULL, NULL, evaluateOperationToken}, + {LSL_BRACKET_CLOSE, ST_NONE, "]", LSL_INNER2OUTER | LSL_CREATION, NULL, NULL, evaluateNoToken}, {LSL_BRACKET_OPEN, ST_NONE, "[", LSL_INNER2OUTER | LSL_CREATION, NULL, NULL, evaluateOperationToken}, {LSL_PARENTHESIS_CLOSE, ST_NONE, ")", LSL_INNER2OUTER, NULL, NULL, evaluateNoToken}, {LSL_PARENTHESIS_OPEN, ST_NONE, "(", LSL_INNER2OUTER, outputParenthesisToken, NULL, eveluateParenthesisToken}, -// {LSL_ASSIGNMENT_CONCATENATE, ST_CONCATENATION "+=", LSL_RIGHT2LEFT | LSL_ASSIGNMENT, NULL, NULL, evaluateOperationToken}, + {LSL_ASSIGNMENT_CONCATENATE,ST_CONCATENATION, "+=", LSL_RIGHT2LEFT | LSL_ASSIGNMENT, NULL, NULL, evaluateOperationToken}, {LSL_ASSIGNMENT_ADD, ST_CONCATENATION, "+=", LSL_RIGHT2LEFT | LSL_ASSIGNMENT, NULL, NULL, evaluateOperationToken}, {LSL_ASSIGNMENT_SUBTRACT, ST_ASSIGNMENT, "-=", LSL_RIGHT2LEFT | LSL_ASSIGNMENT, NULL, NULL, evaluateOperationToken}, {LSL_ASSIGNMENT_MULTIPLY, ST_ASSIGNMENT, "*=", LSL_RIGHT2LEFT | LSL_ASSIGNMENT, NULL, NULL, evaluateOperationToken}, @@ -68,9 +68,9 @@ LSL_Token LSL_Tokens[] = {LSL_ASSIGNMENT_DIVIDE, ST_ASSIGNMENT, "/=", LSL_RIGHT2LEFT | LSL_ASSIGNMENT, NULL, NULL, evaluateOperationToken}, {LSL_ASSIGNMENT_PLAIN, ST_CONCATENATION, "=", LSL_RIGHT2LEFT | LSL_ASSIGNMENT, NULL, NULL, evaluateOperationToken}, {LSL_DOT, ST_NONE, ".", LSL_RIGHT2LEFT, NULL, NULL, evaluateOperationToken}, -// {LSL_DECREMENT_POST, ST_NONE, "--", LSL_RIGHT2LEFT | LSL_UNARY, NULL, NULL, evaluateOperationToken}, + {LSL_DECREMENT_POST, ST_NONE, "--", LSL_RIGHT2LEFT | LSL_UNARY, NULL, NULL, evaluateOperationToken}, {LSL_DECREMENT_PRE, ST_NONE, "--", LSL_RIGHT2LEFT | LSL_UNARY, NULL, NULL, evaluateOperationToken}, -// {LSL_INCREMENT_POST, ST_NONE, "++", LSL_RIGHT2LEFT | LSL_UNARY, NULL, NULL, evaluateOperationToken}, + {LSL_INCREMENT_POST, ST_NONE, "++", LSL_RIGHT2LEFT | LSL_UNARY, NULL, NULL, evaluateOperationToken}, {LSL_INCREMENT_PRE, ST_NONE, "++", LSL_RIGHT2LEFT | LSL_UNARY, NULL, NULL, evaluateOperationToken}, {LSL_COMMA, ST_NONE, ",", LSL_LEFT2RIGHT, NULL, NULL, evaluateOperationToken}, @@ -79,11 +79,11 @@ LSL_Token LSL_Tokens[] = // Types. {LSL_FLOAT, ST_NONE, "float", LSL_NONE, outputFloatToken, NULL, evaluateFloatToken}, {LSL_INTEGER, ST_NONE, "integer", LSL_NONE, outputIntegerToken, NULL, evaluateIntegerToken}, -// {LSL_KEY, ST_NONE, "key", LSL_NONE, NULL, NULL, NULL}, -// {LSL_LIST, ST_NONE, "list", LSL_NONE, NULL, NULL, NULL}, -// {LSL_ROTATION, ST_NONE, "rotation", LSL_NONE, NULL, NULL, NULL}, -// {LSL_STRING, ST_NONE, "string", LSL_NONE, NULL, NULL, NULL}, -// {LSL_VECTOR, ST_NONE, "vector", LSL_NONE, NULL, NULL, NULL}, + {LSL_KEY, ST_NONE, "key", LSL_NONE, NULL, NULL, NULL}, + {LSL_LIST, ST_NONE, "list", LSL_NONE, NULL, NULL, NULL}, + {LSL_ROTATION, ST_NONE, "rotation", LSL_NONE, NULL, NULL, NULL}, + {LSL_STRING, ST_NONE, "string", LSL_NONE, NULL, NULL, NULL}, + {LSL_VECTOR, ST_NONE, "vector", LSL_NONE, NULL, NULL, NULL}, // Types names. {LSL_TYPE_FLOAT, ST_NONE, "float", LSL_NONE, NULL, NULL, NULL}, @@ -101,7 +101,7 @@ LSL_Token LSL_Tokens[] = {LSL_DO, ST_NONE, "do", LSL_NONE, NULL, NULL, NULL}, {LSL_FOR, ST_NONE, "for", LSL_NONE, NULL, NULL, NULL}, -// {LSL_ELSE_IF, ST_NONE, "else if", LSL_NONE, NULL, NULL, NULL}, + {LSL_ELSE_IF, ST_NONE, "else if", LSL_NONE, NULL, NULL, NULL}, {LSL_ELSE, ST_NONE, "else", LSL_NONE, NULL, NULL, NULL}, {LSL_IF, ST_NONE, "if", LSL_NONE, NULL, NULL, NULL}, {LSL_JUMP, ST_NONE, "jump", LSL_NONE, NULL, NULL, NULL}, @@ -112,9 +112,9 @@ LSL_Token LSL_Tokens[] = {LSL_BLOCK_CLOSE, ST_NONE, "}", LSL_NONE, NULL, NULL, NULL}, {LSL_BLOCK_OPEN, ST_NONE, "{", LSL_NONE, NULL, NULL, NULL}, -// {LSL_PARAMETER, ST_NONE, "parameter", LSL_NONE, NULL, NULL, NULL}, -// {LSL_FUNCTION, ST_NONE, "function", LSL_NONE, NULL, NULL, NULL}, -// {LSL_STATE, ST_NONE, "state", LSL_NONE, NULL, NULL, NULL}, + {LSL_PARAMETER, ST_NONE, "parameter", LSL_NONE, NULL, NULL, NULL}, + {LSL_FUNCTION, ST_NONE, "function", LSL_NONE, NULL, NULL, NULL}, + {LSL_STATE, ST_NONE, "state", LSL_NONE, NULL, NULL, NULL}, {LSL_SCRIPT, ST_NONE, "", LSL_NONE, NULL, NULL, NULL}, {LSL_UNKNOWN, ST_NONE, "unknown", LSL_NONE, NULL, NULL, NULL}, @@ -260,7 +260,7 @@ LSL_Leaf *addOperation(LSL_Leaf *left, LSL_Leaf *lval, LSL_Leaf *right) if (LSL_MULTIPLY == lval->token->type) { lval->basicType = OT_float; -// lval->token = tokens[LSL_DOT_PRODUCT - lowestToken]; + lval->token = tokens[LSL_DOT_PRODUCT - lowestToken]; } else lval->basicType = OT_vector; @@ -311,6 +311,29 @@ LSL_Leaf *addStatement(LSL_Leaf *lval, LSL_Type type, LSL_Leaf *expr) return lval; } +LSL_Leaf *addTypecast(LSL_Leaf *lval, LSL_Leaf *type, LSL_Leaf *rval) +{ + LSL_Parenthesis *parens = malloc(sizeof(LSL_Parenthesis)); + + if (parens) + { + parens->left = lval; + parens->expression = type; + parens->right = rval; + if (lval) + { + lval->value.parenthesis = parens; + lval->basicType = type->basicType; + lval->token = tokens[LSL_TYPECAST_OPEN - lowestToken]; + } + if (rval) + { + rval->token = tokens[LSL_TYPECAST_CLOSE - lowestToken]; + } + } + return lval; +} + static LSL_Leaf *evaluateLeaf(LSL_Leaf *leaf, LSL_Leaf *left, LSL_Leaf *right) { LSL_Leaf *result = NULL; @@ -479,9 +502,9 @@ static LSL_Leaf *evaluateOperationToken(LSL_Leaf *content, LSL_Leaf *left, LSL_L { case LSL_COMMA : case LSL_INCREMENT_PRE : -// case LSL_INCREMENT_POST : + case LSL_INCREMENT_POST : case LSL_DECREMENT_PRE : -// case LSL_DECREMENT_POST : + case LSL_DECREMENT_POST : case LSL_ASSIGNMENT_PLAIN : case LSL_ASSIGNMENT_DIVIDE : case LSL_ASSIGNMENT_MULTIPLY : @@ -491,9 +514,9 @@ static LSL_Leaf *evaluateOperationToken(LSL_Leaf *content, LSL_Leaf *left, LSL_L case LSL_BRACKET_CLOSE : case LSL_ANGLE_OPEN : case LSL_ANGLE_CLOSE : -// case LSL_TYPECAST_OPEN : -// case LSL_TYPECAST_CLOSE : -// case LSL_DOT_PRODUCT : + case LSL_TYPECAST_OPEN : + case LSL_TYPECAST_CLOSE : + case LSL_DOT_PRODUCT : break; case LSL_NEGATION : result->value.floatValue = 0 - fright; break; case LSL_DIVIDE : result->value.floatValue = fleft / fright; break; @@ -519,9 +542,9 @@ static LSL_Leaf *evaluateOperationToken(LSL_Leaf *content, LSL_Leaf *left, LSL_L { case LSL_COMMA : case LSL_INCREMENT_PRE : -// case LSL_INCREMENT_POST : + case LSL_INCREMENT_POST : case LSL_DECREMENT_PRE : -// case LSL_DECREMENT_POST : + case LSL_DECREMENT_POST : case LSL_DOT : case LSL_ASSIGNMENT_PLAIN : case LSL_ASSIGNMENT_DIVIDE : @@ -533,8 +556,8 @@ static LSL_Leaf *evaluateOperationToken(LSL_Leaf *content, LSL_Leaf *left, LSL_L case LSL_BRACKET_CLOSE : case LSL_ANGLE_OPEN : case LSL_ANGLE_CLOSE : -// case LSL_TYPECAST_OPEN : -// case LSL_TYPECAST_CLOSE : + case LSL_TYPECAST_OPEN : + case LSL_TYPECAST_CLOSE : break; case LSL_BIT_NOT : result->value.integerValue = ~ right->value.integerValue; break; case LSL_BOOL_NOT : result->value.integerValue = ! right->value.integerValue; break; diff --git a/LuaSL/src/LuaSL_LSL_tree.h b/LuaSL/src/LuaSL_LSL_tree.h index 9a71c17..e56e94c 100644 --- a/LuaSL/src/LuaSL_LSL_tree.h +++ b/LuaSL/src/LuaSL_LSL_tree.h @@ -289,6 +289,7 @@ LSL_Leaf *addExpression(LSL_Leaf *exp); LSL_Leaf *addOperation(LSL_Leaf *left, LSL_Leaf *lval, LSL_Leaf *right); LSL_Leaf *addParenthesis(LSL_Leaf *lval, LSL_Leaf *expr, LSL_Leaf *rval); LSL_Leaf *addStatement(LSL_Leaf *lval, LSL_Type type, LSL_Leaf *expr); +LSL_Leaf *addTypecast(LSL_Leaf *lval, LSL_Leaf *expr, LSL_Leaf *rval); void *ParseAlloc(void *(*mallocProc)(size_t)); void ParseTrace(FILE *TraceFILE, char *zTracePrompt); diff --git a/LuaSL/src/LuaSL_lemon_yaccer.y b/LuaSL/src/LuaSL_lemon_yaccer.y index 5cffb73..9d08fa9 100644 --- a/LuaSL/src/LuaSL_lemon_yaccer.y +++ b/LuaSL/src/LuaSL_lemon_yaccer.y @@ -36,10 +36,10 @@ expr(A) ::= expr(B) LSL_LESS_THAN(C) expr(D). { A = addOperation(B, C, D); } expr(A) ::= expr(B) LSL_RIGHT_SHIFT(C) expr(D). { A = addOperation(B, C, D); } expr(A) ::= expr(B) LSL_LEFT_SHIFT(C) expr(D). { A = addOperation(B, C, D); } -%left LSL_SUBTRACT LSL_ADD. +%left LSL_SUBTRACT LSL_ADD LSL_CONCATENATE. expr(A) ::= expr(B) LSL_ADD(C) expr(D). { A = addOperation(B, C, D); } expr(A) ::= expr(B) LSL_SUBTRACT(C) expr(D). { A = addOperation(B, C, D); } -%left LSL_DIVIDE LSL_MODULO LSL_MULTIPLY. +%left LSL_DIVIDE LSL_MODULO LSL_MULTIPLY LSL_DOT_PRODUCT LSL_CROSS_PRODUCT. expr(A) ::= expr(B) LSL_MULTIPLY(C) expr(D). { A = addOperation(B, C, D); } expr(A) ::= expr(B) LSL_MODULO(C) expr(D). { A = addOperation(B, C, D); } expr(A) ::= expr(B) LSL_DIVIDE(C) expr(D). { A = addOperation(B, C, D); } @@ -49,29 +49,40 @@ 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); } +%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. %left LSL_ANGLE_OPEN LSL_ANGLE_CLOSE. %nonassoc LSL_BRACKET_OPEN LSL_BRACKET_CLOSE. %nonassoc LSL_PARENTHESIS_OPEN LSL_PARENTHESIS_CLOSE LSL_EXPRESSION. expr(A) ::= LSL_PARENTHESIS_OPEN(B) expr(C) LSL_PARENTHESIS_CLOSE(D). { A = addParenthesis(B, C, D); } -%right LSL_ASSIGNMENT_ADD LSL_ASSIGNMENT_SUBTRACT LSL_ASSIGNMENT_MULTIPLY LSL_ASSIGNMENT_MODULO LSL_ASSIGNMENT_DIVIDE LSL_ASSIGNMENT_PLAIN. +expr(A) ::= LSL_PARENTHESIS_OPEN(B) LSL_TYPE_FLOAT(C) LSL_PARENTHESIS_CLOSE(D). { A = addTypecast(B, C, D); } +expr(A) ::= LSL_PARENTHESIS_OPEN(B) LSL_TYPE_INTEGER(C) LSL_PARENTHESIS_CLOSE(D). { A = addTypecast(B, C, D); } +expr(A) ::= LSL_PARENTHESIS_OPEN(B) LSL_TYPE_KEY(C) LSL_PARENTHESIS_CLOSE(D). { A = addTypecast(B, C, D); } +expr(A) ::= LSL_PARENTHESIS_OPEN(B) LSL_TYPE_LIST(C) LSL_PARENTHESIS_CLOSE(D). { A = addTypecast(B, C, D); } +expr(A) ::= LSL_PARENTHESIS_OPEN(B) LSL_TYPE_ROTATION(C) LSL_PARENTHESIS_CLOSE(D). { A = addTypecast(B, C, D); } +expr(A) ::= LSL_PARENTHESIS_OPEN(B) LSL_TYPE_STRING(C) LSL_PARENTHESIS_CLOSE(D). { A = addTypecast(B, C, D); } +expr(A) ::= LSL_PARENTHESIS_OPEN(B) LSL_TYPE_VECTOR(C) LSL_PARENTHESIS_CLOSE(D). { A = addTypecast(B, C, D); } + +%right LSL_ASSIGNMENT_CONCATENATE LSL_ASSIGNMENT_ADD LSL_ASSIGNMENT_SUBTRACT LSL_ASSIGNMENT_MULTIPLY LSL_ASSIGNMENT_MODULO LSL_ASSIGNMENT_DIVIDE LSL_ASSIGNMENT_PLAIN. %right LSL_DOT. -%right LSL_DECREMENT_PRE LSL_INCREMENT_PRE. +%right LSL_DECREMENT_PRE LSL_INCREMENT_PRE LSL_DECREMENT_POST LSL_INCREMENT_POST. %nonassoc LSL_COMMA. %nonassoc LSL_FLOAT. expr(A) ::= LSL_FLOAT(B). { B->basicType = OT_float; A = B; } %nonassoc LSL_INTEGER. expr(A) ::= LSL_INTEGER(B). { B->basicType = OT_integer; A = B; } +%nonassoc LSL_KEY. +%nonassoc LSL_LIST. +%nonassoc LSL_ROTATION. +%nonassoc LSL_STRING. +%nonassoc LSL_VECTOR. -%nonassoc LSL_TYPE_FLOAT LSL_TYPE_INTEGER LSL_TYPE_KEY LSL_TYPE_LIST LSL_TYPE_ROTATION LSL_TYPE_STRING LSL_TYPE_VECTOR. - -%nonassoc LSL_DO LSL_FOR LSL_ELSE LSL_IF LSL_JUMP LSL_RETURN LSL_STATE_CHANGE LSL_WHILE. +%nonassoc LSL_DO LSL_FOR LSL_ELSE LSL_ELSE_IF LSL_IF LSL_JUMP LSL_RETURN LSL_STATE_CHANGE LSL_WHILE. %nonassoc LSL_LABEL. -%nonassoc LSL_BLOCK_OPEN LSL_BLOCK_CLOSE. - %nonassoc LSL_STATEMENT. statement(A) ::= expr(B) LSL_STATEMENT(D). { A = addStatement(D, LSL_EXPRESSION, B); } @@ -79,6 +90,9 @@ statement(A) ::= expr(B) LSL_STATEMENT(D). { A = addStatement(D, LSL_EXPRESS script ::= script statement(A). { A->left = param->ast; param->ast = A; } script ::= statement(A). { A->left = param->ast; param->ast = A; } +%nonassoc LSL_BLOCK_OPEN LSL_BLOCK_CLOSE. +%nonassoc LSL_PARAMETER LSL_FUNCTION LSL_STATE. + %nonassoc LSL_SPACE LSL_COMMENT LSL_COMMENT_LINE LSL_UNKNOWN. -- cgit v1.1