From 0044bfde9f23898319ba94677b2e9d193a55ed1d Mon Sep 17 00:00:00 2001 From: David Walter Seikel Date: Mon, 9 Jan 2012 03:13:25 +1000 Subject: Add most of the rest of the tokens, but ignore them. --- LuaSL/src/LuaSL_LSL_tree.c | 99 +++++++++++++++++++++++++--------------------- LuaSL/src/LuaSL_lexer.l | 39 +++++++++++++++++- LuaSL/src/LuaSL_yaccer.y | 34 +++++++++++----- 3 files changed, 118 insertions(+), 54 deletions(-) (limited to 'LuaSL') diff --git a/LuaSL/src/LuaSL_LSL_tree.c b/LuaSL/src/LuaSL_LSL_tree.c index 9f663e5..57e639a 100644 --- a/LuaSL/src/LuaSL_LSL_tree.c +++ b/LuaSL/src/LuaSL_LSL_tree.c @@ -50,31 +50,31 @@ LSL_Token LSL_Tokens[] = {LSL_BIT_NOT, "~", LSL_RIGHT2LEFT | LSL_UNARY, outputOperationToken, NULL, evaluateOperationToken}, // {LSL_TYPECAST_CLOSE, ")", LSL_RIGHT2LEFT | LSL_UNARY, outputOperationToken, NULL, evaluateOperationToken}, // {LSL_TYPECAST_OPEN, "(", LSL_RIGHT2LEFT | LSL_UNARY, outputOperationToken, NULL, evaluateOperationToken}, -// {LSL_ANGLE_CLOSE, ">", LSL_LEFT2RIGHT | LSL_CREATION, outputOperationToken, NULL, evaluateOperationToken}, -// {LSL_ANGLE_OPEN, "<", LSL_LEFT2RIGHT | LSL_CREATION, outputOperationToken, NULL, evaluateOperationToken}, -// {LSL_BRACKET_CLOSE, "]", LSL_INNER2OUTER | LSL_CREATION, outputOperationToken, NULL, evaluateOperationToken}, -// {LSL_BRACKET_OPEN, "[", LSL_INNER2OUTER | LSL_CREATION, outputOperationToken, NULL, evaluateOperationToken}, + {LSL_ANGLE_CLOSE, ">", LSL_LEFT2RIGHT | LSL_CREATION, outputOperationToken, NULL, evaluateOperationToken}, + {LSL_ANGLE_OPEN, "<", LSL_LEFT2RIGHT | LSL_CREATION, outputOperationToken, NULL, evaluateOperationToken}, + {LSL_BRACKET_CLOSE, "]", LSL_INNER2OUTER | LSL_CREATION, outputOperationToken, NULL, evaluateOperationToken}, + {LSL_BRACKET_OPEN, "[", LSL_INNER2OUTER | LSL_CREATION, outputOperationToken, NULL, evaluateOperationToken}, {LSL_PARENTHESIS_CLOSE, ")", LSL_INNER2OUTER, NULL, NULL, evaluateNoToken}, {LSL_PARENTHESIS_OPEN, "(", LSL_INNER2OUTER, NULL, NULL, NULL}, // {LSL_ASSIGNMENT_CONCATENATE, "+=", LSL_RIGHT2LEFT | LSL_ASSIGNMENT, outputOperationToken, NULL, evaluateOperationToken}, -// {LSL_ASSIGNMENT_ADD, "+=", LSL_RIGHT2LEFT | LSL_ASSIGNMENT, outputOperationToken, NULL, evaluateOperationToken}, -// {LSL_ASSIGNMENT_SUBTRACT, "-=", LSL_RIGHT2LEFT | LSL_ASSIGNMENT, outputOperationToken, NULL, evaluateOperationToken}, -// {LSL_ASSIGNMENT_MULTIPLY, "*=", LSL_RIGHT2LEFT | LSL_ASSIGNMENT, outputOperationToken, NULL, evaluateOperationToken}, -// {LSL_ASSIGNMENT_MODULO, "%=", LSL_RIGHT2LEFT | LSL_ASSIGNMENT, outputOperationToken, NULL, evaluateOperationToken}, -// {LSL_ASSIGNMENT_DIVIDE, "/=", LSL_RIGHT2LEFT | LSL_ASSIGNMENT, outputOperationToken, NULL, evaluateOperationToken}, -// {LSL_ASSIGNMENT_PLAIN, "=", LSL_RIGHT2LEFT | LSL_ASSIGNMENT, outputOperationToken, NULL, evaluateOperationToken}, -// {LSL_DOT, ".", LSL_RIGHT2LEFT, outputOperationToken, NULL, evaluateOperationToken}, + {LSL_ASSIGNMENT_ADD, "+=", LSL_RIGHT2LEFT | LSL_ASSIGNMENT, outputOperationToken, NULL, evaluateOperationToken}, + {LSL_ASSIGNMENT_SUBTRACT, "-=", LSL_RIGHT2LEFT | LSL_ASSIGNMENT, outputOperationToken, NULL, evaluateOperationToken}, + {LSL_ASSIGNMENT_MULTIPLY, "*=", LSL_RIGHT2LEFT | LSL_ASSIGNMENT, outputOperationToken, NULL, evaluateOperationToken}, + {LSL_ASSIGNMENT_MODULO, "%=", LSL_RIGHT2LEFT | LSL_ASSIGNMENT, outputOperationToken, NULL, evaluateOperationToken}, + {LSL_ASSIGNMENT_DIVIDE, "/=", LSL_RIGHT2LEFT | LSL_ASSIGNMENT, outputOperationToken, NULL, evaluateOperationToken}, + {LSL_ASSIGNMENT_PLAIN, "=", LSL_RIGHT2LEFT | LSL_ASSIGNMENT, outputOperationToken, NULL, evaluateOperationToken}, + {LSL_DOT, ".", LSL_RIGHT2LEFT, outputOperationToken, NULL, evaluateOperationToken}, // {LSL_DECREMENT_POST, "--", LSL_RIGHT2LEFT | LSL_UNARY, outputOperationToken, NULL, evaluateOperationToken}, -// {LSL_DECREMENT_PRE, "--", LSL_RIGHT2LEFT | LSL_UNARY, outputOperationToken, NULL, evaluateOperationToken}, + {LSL_DECREMENT_PRE, "--", LSL_RIGHT2LEFT | LSL_UNARY, outputOperationToken, NULL, evaluateOperationToken}, // {LSL_INCREMENT_POST, "++", LSL_RIGHT2LEFT | LSL_UNARY, outputOperationToken, NULL, evaluateOperationToken}, -// {LSL_INCREMENT_PRE, "++", LSL_RIGHT2LEFT | LSL_UNARY, outputOperationToken, NULL, evaluateOperationToken}, -// {LSL_COMMA, ",", LSL_LEFT2RIGHT, outputOperationToken, NULL, evaluateOperationToken}, + {LSL_INCREMENT_PRE, "++", LSL_RIGHT2LEFT | LSL_UNARY, outputOperationToken, NULL, evaluateOperationToken}, + {LSL_COMMA, ",", LSL_LEFT2RIGHT, outputOperationToken, NULL, evaluateOperationToken}, {LSL_EXPRESSION, "expression", LSL_NONE, NULL, NULL, NULL}, // Types. -// {LSL_FLOAT, "float", LSL_NONE, NULL, NULL, NULL}, + {LSL_FLOAT, "float", LSL_NONE, NULL, NULL, NULL}, {LSL_INTEGER, "integer", LSL_NONE, outputIntegerToken, NULL, evaluateIntegerToken}, // {LSL_KEY, "key", LSL_NONE, NULL, NULL, NULL}, // {LSL_LIST, "list", LSL_NONE, NULL, NULL, NULL}, @@ -82,25 +82,35 @@ LSL_Token LSL_Tokens[] = // {LSL_STRING, "string", LSL_NONE, NULL, NULL, NULL}, // {LSL_VECTOR, "vector", LSL_NONE, NULL, NULL, NULL}, + // Types names. + + {LSL_TYPE_FLOAT, "float", LSL_NONE, NULL, NULL, NULL}, + {LSL_TYPE_INTEGER, "integer", LSL_NONE, NULL, NULL, NULL}, + {LSL_TYPE_KEY, "key", LSL_NONE, NULL, NULL, NULL}, + {LSL_TYPE_LIST, "list", LSL_NONE, NULL, NULL, NULL}, + {LSL_TYPE_ROTATION, "rotation", LSL_NONE, NULL, NULL, NULL}, + {LSL_TYPE_STRING, "string", LSL_NONE, NULL, NULL, NULL}, + {LSL_TYPE_VECTOR, "vector", LSL_NONE, NULL, NULL, NULL}, + // Then the rest of the syntax tokens. // {LSL_IDENTIFIER, "identifier", LSL_NONE, NULL, NULL, NULL}, -// {LSL_LABEL, "@", LSL_NONE, NULL, NULL, NULL}, + {LSL_LABEL, "@", LSL_NONE, NULL, NULL, NULL}, -// {LSL_DO, "do", LSL_NONE, NULL, NULL, NULL}, -// {LSL_FOR, "for", LSL_NONE, NULL, NULL, NULL}, + {LSL_DO, "do", LSL_NONE, NULL, NULL, NULL}, + {LSL_FOR, "for", LSL_NONE, NULL, NULL, NULL}, // {LSL_ELSE_IF, "else if", LSL_NONE, NULL, NULL, NULL}, -// {LSL_ELSE, "else", LSL_NONE, NULL, NULL, NULL}, -// {LSL_IF, "if", LSL_NONE, NULL, NULL, NULL}, -// {LSL_JUMP, "jump", LSL_NONE, NULL, NULL, NULL}, -// {LSL_RETURN, "return", LSL_NONE, NULL, NULL, NULL}, -// {LSL_STATE_CHANGE, "state", LSL_NONE, NULL, NULL, NULL}, -// {LSL_WHILE, "while", LSL_NONE, NULL, NULL, NULL}, + {LSL_ELSE, "else", LSL_NONE, NULL, NULL, NULL}, + {LSL_IF, "if", LSL_NONE, NULL, NULL, NULL}, + {LSL_JUMP, "jump", LSL_NONE, NULL, NULL, NULL}, + {LSL_RETURN, "return", LSL_NONE, NULL, NULL, NULL}, + {LSL_STATE_CHANGE, "state", LSL_NONE, NULL, NULL, NULL}, + {LSL_WHILE, "while", LSL_NONE, NULL, NULL, NULL}, {LSL_STATEMENT, ";", LSL_NONE, outputStatementToken, NULL, evaluateStatementToken}, -// {LSL_BLOCK_CLOSE, "}", LSL_NONE, NULL, NULL, NULL}, -// {LSL_BLOCK_OPEN, "{", LSL_NONE, NULL, NULL, NULL}, + {LSL_BLOCK_CLOSE, "}", LSL_NONE, NULL, NULL, NULL}, + {LSL_BLOCK_OPEN, "{", LSL_NONE, NULL, NULL, NULL}, // {LSL_PARAMETER, "parameter", LSL_NONE, NULL, NULL, NULL}, // {LSL_FUNCTION, "function", LSL_NONE, NULL, NULL, NULL}, // {LSL_STATE, "state", LSL_NONE, NULL, NULL, NULL}, @@ -281,27 +291,28 @@ static void evaluateOperationToken(LSL_Leaf *content, LSL_Value *left, LSL_Value switch (content->operationValue) { -// case LSL_COMMA : -// case LSL_INCREMENT_PRE : + case LSL_COMMA : + case LSL_INCREMENT_PRE : // case LSL_INCREMENT_POST : -// case LSL_DECREMENT_PRE : + case LSL_DECREMENT_PRE : // case LSL_DECREMENT_POST : -// case LSL_DOT : -// case LSL_ASSIGNMENT_PLAIN : -// case LSL_ASSIGNMENT_DIVIDE : -// case LSL_ASSIGNMENT_MODULO : -// case LSL_ASSIGNMENT_MULTIPLY : -// case LSL_ASSIGNMENT_SUBTRACT : -// case LSL_ASSIGNMENT_ADD : + case LSL_DOT : + case LSL_ASSIGNMENT_PLAIN : + case LSL_ASSIGNMENT_DIVIDE : + case LSL_ASSIGNMENT_MODULO : + case LSL_ASSIGNMENT_MULTIPLY : + case LSL_ASSIGNMENT_SUBTRACT : + case LSL_ASSIGNMENT_ADD : // case LSL_ASSIGNMENT_CONCATENATE : -// case LSL_PARENTHESIS_OPEN : -// case LSL_PARENTHESIS_CLOSE : -// case LSL_BRACKET_OPEN : -// case LSL_BRACKET_CLOSE : -// case LSL_ANGLE_OPEN : -// case LSL_ANGLE_CLOSE : -// case LSL_TYPECAST : -// break; + case LSL_PARENTHESIS_OPEN : + case LSL_PARENTHESIS_CLOSE : + case LSL_BRACKET_OPEN : + case LSL_BRACKET_CLOSE : + case LSL_ANGLE_OPEN : + case LSL_ANGLE_CLOSE : +// case LSL_TYPECAST_OPEN : +// case LSL_TYPECAST_CLOSE : + break; case LSL_BIT_NOT : left->content.integerValue = ~ right->content.integerValue; break; case LSL_BOOL_NOT : left->content.integerValue = ! right->content.integerValue; break; case LSL_NEGATION : left->content.integerValue = 0 - right->content.integerValue; break; diff --git a/LuaSL/src/LuaSL_lexer.l b/LuaSL/src/LuaSL_lexer.l index 9753a57..8628ca4 100644 --- a/LuaSL/src/LuaSL_lexer.l +++ b/LuaSL/src/LuaSL_lexer.l @@ -53,15 +53,52 @@ NAME [[:alpha:]](_|[[:alpha:]]|[[:digit:]])* "/" { ECHO; return LSL_DIVIDE; } "!" { ECHO; return LSL_BOOL_NOT; } "~" { ECHO; return LSL_BIT_NOT; } + /* "<" { ECHO; return LSL_ANGLE_OPEN; } */ + /* ">" { ECHO; return LSL_ANGLE_CLOSE; } */ +"[" { ECHO; return LSL_BRACKET_OPEN; } +"]" { ECHO; return LSL_BRACKET_CLOSE; } "(" { ECHO; return LSL_PARENTHESIS_OPEN; } ")" { ECHO; return LSL_PARENTHESIS_CLOSE; } +"+=" { ECHO; return LSL_ASSIGNMENT_ADD; } +"-=" { ECHO; return LSL_ASSIGNMENT_SUBTRACT; } +"*=" { ECHO; return LSL_ASSIGNMENT_MULTIPLY; } +"%=" { ECHO; return LSL_ASSIGNMENT_MODULO; } +"/=" { ECHO; return LSL_ASSIGNMENT_DIVIDE; } +"=" { ECHO; return LSL_ASSIGNMENT_PLAIN; } +"." { ECHO; return LSL_DOT; } +"--" { ECHO; return LSL_DECREMENT_PRE; } +"++" { ECHO; return LSL_INCREMENT_PRE; } +"," { ECHO; return LSL_COMMA; } /* Types. */ {INTEGER} %{ ECHO; yylval->integerValue = atoi(yytext); return LSL_INTEGER; %} -{FLOAT} %{ ECHO; /* yylval->floatValue = atof(yytext); return LSL_FLOAT; */ %} +{FLOAT} %{ ECHO; yylval->floatValue = atof(yytext); return LSL_FLOAT; %} + + /* Type keywords. */ +"float" %{ ECHO; return LSL_TYPE_FLOAT; %} +"integer" %{ ECHO; return LSL_TYPE_INTEGER; %} +"key" %{ ECHO; return LSL_TYPE_KEY; %} +"list" %{ ECHO; return LSL_TYPE_LIST; %} +"rotation" %{ ECHO; return LSL_TYPE_ROTATION; %} +"string" %{ ECHO; return LSL_TYPE_STRING; %} +"vector" %{ ECHO; return LSL_TYPE_VECTOR; %} + + /* Statement keywords. */ +"do" %{ ECHO; return LSL_DO; %} +"for" %{ ECHO; return LSL_FOR; %} +"else" %{ ECHO; return LSL_ELSE; %} +"if" %{ ECHO; return LSL_IF; %} +"jump" %{ ECHO; return LSL_JUMP; %} +"return" %{ ECHO; return LSL_RETURN; %} +"state" %{ ECHO; return LSL_STATE_CHANGE; %} +"while" %{ ECHO; return LSL_WHILE; %} {NAME} %{ ECHO; /* yylval->nameValue = strdup(yytext); return LSL_NAME; */ %} + /* Other symbols. */ +"@" %{ ECHO; return LSL_LABEL; %} +"{" %{ ECHO; return LSL_BLOCK_OPEN; %} +"}" %{ ECHO; return LSL_BLOCK_CLOSE; %} ";" { ECHO; return LSL_STATEMENT; } <> { yyterminate(); } diff --git a/LuaSL/src/LuaSL_yaccer.y b/LuaSL/src/LuaSL_yaccer.y index 7f873c2..b9721f8 100644 --- a/LuaSL/src/LuaSL_yaccer.y +++ b/LuaSL/src/LuaSL_yaccer.y @@ -13,19 +13,35 @@ %type ignorable %token LSL_SPACE -%type expr -%left LSL_BOOL_AND -%left LSL_BOOL_OR -%left LSL_BIT_AND LSL_BIT_XOR LSL_BIT_OR -%left LSL_EQUAL LSL_NOT_EQUAL -%left LSL_LESS_THAN LSL_GREATER_THAN LSL_LESS_EQUAL LSL_GREATER_EQUAL -%left LSL_LEFT_SHIFT LSL_RIGHT_SHIFT -%left LSL_SUBTRACT LSL_ADD -%left LSL_DIVIDE LSL_MODULO LSL_MULTIPLY +%type expr +%left LSL_BOOL_AND +%left LSL_BOOL_OR +%left LSL_BIT_AND LSL_BIT_XOR LSL_BIT_OR +%left LSL_EQUAL LSL_NOT_EQUAL +%left LSL_LESS_THAN LSL_GREATER_THAN LSL_LESS_EQUAL LSL_GREATER_EQUAL +%left LSL_LEFT_SHIFT LSL_RIGHT_SHIFT +%left LSL_SUBTRACT LSL_ADD +%left LSL_DIVIDE LSL_MODULO LSL_MULTIPLY %right LSL_BIT_NOT LSL_BOOL_NOT LSL_NEGATION +%left LSL_ANGLE_OPEN LSL_ANGLE_CLOSE +%token LSL_BRACKET_OPEN LSL_BRACKET_CLOSE %token LSL_PARENTHESIS_OPEN LSL_PARENTHESIS_CLOSE LSL_EXPRESSION +%right 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 +%token LSL_COMMA + +%token LSL_FLOAT %token LSL_INTEGER +%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_LABEL + +%nonassoc LSL_BLOCK_OPEN LSL_BLOCK_CLOSE + %type statement %nonassoc LSL_STATEMENT -- cgit v1.1