From aa7be467e110de4d3757fc7e0697d89f397aea34 Mon Sep 17 00:00:00 2001 From: David Walter Seikel Date: Sun, 8 Jan 2012 23:47:09 +1000 Subject: Rearrange everything, to be consistant order. --- LuaSL/src/LuaSL_LSL_tree.c | 133 +++++++++++++++++---------------- LuaSL/src/LuaSL_LSL_tree.h | 180 ++++++++++++++++++++++++--------------------- LuaSL/src/LuaSL_lexer.l | 20 +++-- LuaSL/src/LuaSL_yaccer.y | 25 +++---- 4 files changed, 193 insertions(+), 165 deletions(-) diff --git a/LuaSL/src/LuaSL_LSL_tree.c b/LuaSL/src/LuaSL_LSL_tree.c index 11a481d..9f663e5 100644 --- a/LuaSL/src/LuaSL_LSL_tree.c +++ b/LuaSL/src/LuaSL_LSL_tree.c @@ -13,94 +13,103 @@ static void outputStatementToken(LSL_Leaf *content); LSL_Token LSL_Tokens[] = { - // Start with expression operators. - // In order of precedence, high to low. +// {LSL_COMMENT, "/*", LSL_NONE, NULL, NULL, NULL}, +// {LSL_COMMENT_LINE, "//", LSL_NONE, NULL, NULL, NULL}, + {LSL_SPACE, " ", LSL_NONE, NULL, NULL, NULL}, + + // Operators, in order of precedence, low to high // Left to right, unless oterwise stated. // According to http://wiki.secondlife.com/wiki/Category:LSL_Operators -// {LSL_COMMA, ",", LSL_LEFT2RIGHT, outputOperationToken, NULL, evaluateOperationToken}, -// {LSL_INCREMENT_PRE, "++", LSL_RIGHT2LEFT | LSL_UNARY, outputOperationToken, NULL, evaluateOperationToken}, -// {LSL_INCREMENT_POST, "++", LSL_RIGHT2LEFT | LSL_UNARY, outputOperationToken, NULL, evaluateOperationToken}, -// {LSL_DECREMENT_PRE, "--", LSL_RIGHT2LEFT | LSL_UNARY, outputOperationToken, NULL, evaluateOperationToken}, -// {LSL_DECREMENT_POST, "--", LSL_RIGHT2LEFT | LSL_UNARY, outputOperationToken, NULL, evaluateOperationToken}, -// {LSL_DOT, ".", LSL_RIGHT2LEFT, outputOperationToken, NULL, evaluateOperationToken}, -// {LSL_ASSIGNMENT_PLAIN, "=", LSL_RIGHT2LEFT | LSL_ASSIGNMENT, outputOperationToken, NULL, evaluateOperationToken}, -// {LSL_ASSIGNMENT_DIVIDE, "/=", LSL_RIGHT2LEFT | LSL_ASSIGNMENT, outputOperationToken, NULL, evaluateOperationToken}, -// {LSL_ASSIGNMENT_MODULO, "%=", LSL_RIGHT2LEFT | LSL_ASSIGNMENT, outputOperationToken, NULL, evaluateOperationToken}, -// {LSL_ASSIGNMENT_MULTIPLY, "*=", LSL_RIGHT2LEFT | LSL_ASSIGNMENT, outputOperationToken, NULL, evaluateOperationToken}, -// {LSL_ASSIGNMENT_SUBTRACT, "-=", LSL_RIGHT2LEFT | LSL_ASSIGNMENT, outputOperationToken, NULL, evaluateOperationToken}, -// {LSL_ASSIGNMENT_ADD, "+=", LSL_RIGHT2LEFT | LSL_ASSIGNMENT, outputOperationToken, NULL, evaluateOperationToken}, -// {LSL_ASSIGNMENT_CONCATENATE, "+=", LSL_RIGHT2LEFT | LSL_ASSIGNMENT, outputOperationToken, NULL, evaluateOperationToken}, - {LSL_PARENTHESIS_OPEN, "(", LSL_INNER2OUTER, NULL, NULL, NULL}, - {LSL_PARENTHESIS_CLOSE, ")", LSL_INNER2OUTER, NULL, NULL, evaluateNoToken}, -// {LSL_BRACKET_OPEN, "[", LSL_INNER2OUTER | LSL_CREATION, outputOperationToken, NULL, evaluateOperationToken}, -// {LSL_BRACKET_CLOSE, "]", LSL_INNER2OUTER | LSL_CREATION, outputOperationToken, NULL, evaluateOperationToken}, -// {LSL_ANGLE_OPEN, "<", LSL_LEFT2RIGHT | LSL_CREATION, outputOperationToken, NULL, evaluateOperationToken}, -// {LSL_ANGLE_CLOSE, ">", LSL_LEFT2RIGHT | LSL_CREATION, outputOperationToken, NULL, evaluateOperationToken}, -// {LSL_TYPECAST_OPEN, "(", LSL_RIGHT2LEFT | LSL_UNARY, outputOperationToken, NULL, evaluateOperationToken}, -// {LSL_TYPECAST_CLOSE, ")", LSL_RIGHT2LEFT | LSL_UNARY, outputOperationToken, NULL, evaluateOperationToken}, - {LSL_BIT_NOT, "~", LSL_RIGHT2LEFT | LSL_UNARY, outputOperationToken, NULL, evaluateOperationToken}, - {LSL_BOOL_NOT, "!", LSL_RIGHT2LEFT | LSL_UNARY, outputOperationToken, NULL, evaluateOperationToken}, - {LSL_NEGATION, "-", LSL_RIGHT2LEFT | LSL_UNARY, outputOperationToken, NULL, evaluateOperationToken}, - {LSL_DIVIDE, "/", LSL_LEFT2RIGHT, outputOperationToken, NULL, evaluateOperationToken}, - {LSL_MODULO, "%", LSL_LEFT2RIGHT, outputOperationToken, NULL, evaluateOperationToken}, - {LSL_MULTIPLY, "*", LSL_LEFT2RIGHT, outputOperationToken, NULL, evaluateOperationToken}, -// {LSL_DOT_PRODUCT, "*", LSL_LEFT2RIGHT, outputOperationToken, NULL, evaluateOperationToken}, -// {LSL_CROSS_PRODUCT, "%", LSL_LEFT2RIGHT, outputOperationToken, NULL, evaluateOperationToken}, - {LSL_SUBTRACT, "-", LSL_LEFT2RIGHT, outputOperationToken, NULL, evaluateOperationToken}, - {LSL_ADD, "+", LSL_LEFT2RIGHT, outputOperationToken, NULL, evaluateOperationToken}, -// {LSL_CONCATENATE, "+", LSL_LEFT2RIGHT, outputOperationToken, NULL, evaluateOperationToken}, - {LSL_LEFT_SHIFT, "<<", LSL_LEFT2RIGHT, outputOperationToken, NULL, evaluateOperationToken}, - {LSL_RIGHT_SHIFT, ">>", LSL_LEFT2RIGHT, outputOperationToken, NULL, evaluateOperationToken}, -// QUIRK - Conditionals are executed right to left. Or left to right, depending on who you ask. lol - {LSL_LESS_THAN, "<", LSL_LEFT2RIGHT, outputOperationToken, NULL, evaluateOperationToken}, - {LSL_GREATER_THAN, ">", LSL_LEFT2RIGHT, outputOperationToken, NULL, evaluateOperationToken}, - {LSL_LESS_EQUAL, "<=", LSL_LEFT2RIGHT, outputOperationToken, NULL, evaluateOperationToken}, - {LSL_GREATER_EQUAL, ">=", LSL_LEFT2RIGHT, outputOperationToken, NULL, evaluateOperationToken}, - {LSL_EQUAL, "==", LSL_LEFT2RIGHT, outputOperationToken, NULL, evaluateOperationToken}, - {LSL_NOT_EQUAL, "!=", LSL_LEFT2RIGHT, outputOperationToken, NULL, evaluateOperationToken}, - {LSL_BIT_AND, "&", LSL_LEFT2RIGHT, outputOperationToken, NULL, evaluateOperationToken}, - {LSL_BIT_XOR, "^", LSL_LEFT2RIGHT, outputOperationToken, NULL, evaluateOperationToken}, - {LSL_BIT_OR, "|", LSL_LEFT2RIGHT, outputOperationToken, NULL, evaluateOperationToken}, + {LSL_BOOL_AND, "&&", LSL_LEFT2RIGHT, outputOperationToken, NULL, evaluateOperationToken}, // QUIRK - Seems to be some disagreement about BOOL_AND/BOOL_OR precedence. Either they are equal, or OR is higher. // QUIRK - No boolean short circuiting. {LSL_BOOL_OR, "||", LSL_LEFT2RIGHT, outputOperationToken, NULL, evaluateOperationToken}, - {LSL_BOOL_AND, "&&", LSL_LEFT2RIGHT, outputOperationToken, NULL, evaluateOperationToken}, + {LSL_BIT_OR, "|", LSL_LEFT2RIGHT, outputOperationToken, NULL, evaluateOperationToken}, + {LSL_BIT_XOR, "^", LSL_LEFT2RIGHT, outputOperationToken, NULL, evaluateOperationToken}, + {LSL_BIT_AND, "&", LSL_LEFT2RIGHT, outputOperationToken, NULL, evaluateOperationToken}, +// QUIRK - Conditionals are executed right to left. Or left to right, depending on who you ask. lol + {LSL_NOT_EQUAL, "!=", LSL_LEFT2RIGHT, outputOperationToken, NULL, evaluateOperationToken}, + {LSL_EQUAL, "==", LSL_LEFT2RIGHT, outputOperationToken, NULL, evaluateOperationToken}, + {LSL_GREATER_EQUAL, ">=", LSL_LEFT2RIGHT, outputOperationToken, NULL, evaluateOperationToken}, + {LSL_LESS_EQUAL, "<=", LSL_LEFT2RIGHT, outputOperationToken, NULL, evaluateOperationToken}, + {LSL_GREATER_THAN, ">", LSL_LEFT2RIGHT, outputOperationToken, NULL, evaluateOperationToken}, + {LSL_LESS_THAN, "<", LSL_LEFT2RIGHT, outputOperationToken, NULL, evaluateOperationToken}, + {LSL_RIGHT_SHIFT, ">>", LSL_LEFT2RIGHT, outputOperationToken, NULL, evaluateOperationToken}, + {LSL_LEFT_SHIFT, "<<", LSL_LEFT2RIGHT, outputOperationToken, NULL, evaluateOperationToken}, +// {LSL_CONCATENATE, "+", LSL_LEFT2RIGHT, outputOperationToken, NULL, evaluateOperationToken}, + {LSL_ADD, "+", LSL_LEFT2RIGHT, outputOperationToken, NULL, evaluateOperationToken}, + {LSL_SUBTRACT, "-", LSL_LEFT2RIGHT, outputOperationToken, NULL, evaluateOperationToken}, +// {LSL_CROSS_PRODUCT, "%", LSL_LEFT2RIGHT, outputOperationToken, NULL, evaluateOperationToken}, +// {LSL_DOT_PRODUCT, "*", LSL_LEFT2RIGHT, outputOperationToken, NULL, evaluateOperationToken}, + {LSL_MULTIPLY, "*", LSL_LEFT2RIGHT, outputOperationToken, NULL, evaluateOperationToken}, + {LSL_MODULO, "%", LSL_LEFT2RIGHT, outputOperationToken, NULL, evaluateOperationToken}, + {LSL_DIVIDE, "/", LSL_LEFT2RIGHT, outputOperationToken, NULL, evaluateOperationToken}, + {LSL_NEGATION, "-", LSL_RIGHT2LEFT | LSL_UNARY, outputOperationToken, NULL, evaluateOperationToken}, + {LSL_BOOL_NOT, "!", LSL_RIGHT2LEFT | LSL_UNARY, outputOperationToken, NULL, evaluateOperationToken}, + {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_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_DECREMENT_POST, "--", 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}, - // Then the rest of the syntax tokens. + {LSL_EXPRESSION, "expression", LSL_NONE, NULL, NULL, NULL}, + + // Types. - {LSL_SPACE, " ", LSL_NONE, NULL, NULL, NULL}, -// {LSL_COMMENT_LINE, "//", LSL_NONE, NULL, NULL, NULL}, -// {LSL_COMMENT, "/*", LSL_NONE, NULL, NULL, NULL}, -// {LSL_TYPE, "type", LSL_NONE, NULL, NULL, NULL}, -// {LSL_NAME, "name", LSL_NONE, NULL, NULL, NULL}, -// {LSL_IDENTIFIER, "identifier", LSL_NONE, NULL, NULL, NULL}, // {LSL_FLOAT, "float", LSL_NONE, NULL, NULL, NULL}, {LSL_INTEGER, "integer", LSL_NONE, outputIntegerToken, NULL, evaluateIntegerToken}, -// {LSL_STRING, "string", LSL_NONE, NULL, NULL, NULL}, // {LSL_KEY, "key", LSL_NONE, NULL, NULL, NULL}, -// {LSL_VECTOR, "vector", LSL_NONE, NULL, NULL, NULL}, -// {LSL_ROTATION, "rotation", LSL_NONE, NULL, NULL, NULL}, // {LSL_LIST, "list", LSL_NONE, NULL, NULL, NULL}, +// {LSL_ROTATION, "rotation", LSL_NONE, NULL, NULL, NULL}, +// {LSL_STRING, "string", LSL_NONE, NULL, NULL, NULL}, +// {LSL_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_EXPRESSION, "expression", LSL_NONE, NULL, NULL, NULL}, + // {LSL_DO, "do", LSL_NONE, NULL, NULL, NULL}, // {LSL_FOR, "for", LSL_NONE, NULL, NULL, NULL}, -// {LSL_IF, "if", LSL_NONE, NULL, NULL, NULL}, -// {LSL_ELSE, "else", 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_RETURN, "return", LSL_NONE, NULL, NULL, NULL}, {LSL_STATEMENT, ";", LSL_NONE, outputStatementToken, NULL, evaluateStatementToken}, -// {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}, // {LSL_SCRIPT, "script", LSL_NONE, NULL, NULL, NULL}, + // {LSL_UNKNOWN, "unknown", LSL_NONE, NULL, NULL, NULL}, + + // A sentinal. + {999999, NULL, LSL_NONE, NULL, NULL, NULL} }; diff --git a/LuaSL/src/LuaSL_LSL_tree.h b/LuaSL/src/LuaSL_LSL_tree.h index 257f18b..adefa07 100644 --- a/LuaSL/src/LuaSL_LSL_tree.h +++ b/LuaSL/src/LuaSL_LSL_tree.h @@ -19,8 +19,24 @@ extern int yydebug; // http://w-hat.com/stackdepth is a useful discussion about some aspects of the LL parser. + +typedef union _LSL_Leaf LSL_Leaf; +typedef struct _LSL_Value LSL_Value; +typedef struct _LSL_Identifier LSL_Identifier; +typedef struct _LSL_Statement LSL_Statement; +typedef struct _LSL_Block LSL_Block; +typedef struct _LSL_Function LSL_Function; +typedef struct _LSL_State LSL_State; +typedef struct _LSL_Script LSL_Script; +typedef struct _LSL_AST LSL_AST; + +typedef int LSL_Type; + +typedef void (*convertToken2Lua) (LSL_Leaf *content); +typedef void (*outputToken) (LSL_Leaf *content); +typedef void (*evaluateToken) (LSL_Leaf *content, LSL_Value *left, LSL_Value *right); + #ifndef FALSE -// NEVER change this typedef enum { FALSE = 0, @@ -39,111 +55,111 @@ typedef enum LSL_CREATION = 32 } LSL_Flags; -typedef int LSL_Type; - typedef struct { - LSL_Type type; - struct LSL_AST *expression; -} LSL_Statement; + LSL_Type type; + char *token; + LSL_Flags flags; + outputToken output; + convertToken2Lua convert; + evaluateToken evaluate; +} LSL_Token; -typedef struct +union _LSL_Leaf { - LSL_Statement *statements; -} LSL_Block; - -typedef struct + char *commentValue; + char *spaceValue; + + LSL_Type operationValue; + LSL_AST *expressionValue; + + float floatValue; + int integerValue; + char *keyValue; + LSL_Leaf *listValue; + char *stringValue; + float vectorValue[3]; + float rotationValue[4]; + + LSL_Identifier *variableValue; + + char *labelValue; + LSL_Statement *doValue; + LSL_Statement *forValue; + LSL_Statement *elseIfValue; + LSL_Statement *elseValue; + LSL_Statement *ifValue; + char *jumpValue; + LSL_Statement *returnValue; + char *stateChangeValue; + LSL_Statement *whileValue; + LSL_Statement *statementValue; + + LSL_Block *blockValue; + LSL_Identifier *parameterValue; + LSL_Function *functionValue; + LSL_State *stateValue; + LSL_Script *scriptValue; + + char *unknownValue; +}; + +struct _LSL_Value { - char *name; - struct LSL_Identifier *parameters; - LSL_Block block; - LSL_Type type; -} LSL_Function; + LSL_Leaf content; + LSL_Type type; +}; -typedef struct +struct _LSL_Identifier // For variables and function parameters. { - char *name; - LSL_Function *handlers; -} LSL_State; + char *name; + LSL_Value value; +}; -typedef struct +struct _LSL_Statement { - char *name; - struct LSL_Identifier *variables; - LSL_Function *functions; - LSL_State *states; -} LSL_Script; + LSL_AST *expression; + LSL_Type type; +}; -typedef union LSL_Leaf +struct _LSL_Block { - char *spaceValue; - char *commentValue; - LSL_Type typeValue; - char *nameValue; - struct LSL_Identifier *identifierValue; - float floatValue; - int integerValue; - char *stringValue; - char *keyValue; - float vectorValue[3]; - float rotationValue[4]; - union LSL_Leaf *listValue; - char *labelValue; - LSL_Type operationValue; - struct LSL_AST *expressionValue; - LSL_Statement *doValue; - LSL_Statement *forValue; - LSL_Statement *ifValue; - LSL_Statement *elseValue; - LSL_Statement *elseIfValue; - char *jumpValue; - char *stateChangeValue; - LSL_Statement *statementValue; - struct LSL_Identifier *parameterValue; - LSL_Function *functionValue; - LSL_State *stateValue; - LSL_Script *scriptValue; - char *unknownValue; -} LSL_Leaf; + LSL_Statement *statements; +}; -typedef struct +struct _LSL_Function { + char *name; + LSL_Block block; + LSL_Identifier *parameters; LSL_Type type; - LSL_Leaf content; -} LSL_Value; - -typedef void (*convertToken2Lua) (LSL_Leaf *content); -typedef void (*outputToken) (LSL_Leaf *content); -typedef void (*evaluateToken) (LSL_Leaf *content, LSL_Value *left, LSL_Value *right); +}; -typedef struct +struct _LSL_State { - LSL_Type type; - char *token; - LSL_Flags flags; - outputToken output; - convertToken2Lua convert; - evaluateToken evaluate; -} LSL_Token; + char *name; + LSL_Function *handlers; +}; -typedef struct +struct _LSL_Script { char *name; - LSL_Type type; - LSL_Leaf content; -} LSL_Identifier; + LSL_Function *functions; + LSL_State *states; + LSL_Identifier *variables; +}; -typedef struct LSL_AST +struct _LSL_AST { - struct LSL_AST *left; - struct LSL_AST *right; - int line; - int character; + LSL_AST *left; + LSL_AST *right; LSL_Token *token; LSL_Leaf content; -} LSL_AST; + int line; + int character; +}; + - // define the type for flex and bison #define YYSTYPE LSL_Leaf diff --git a/LuaSL/src/LuaSL_lexer.l b/LuaSL/src/LuaSL_lexer.l index 2166743..9753a57 100644 --- a/LuaSL/src/LuaSL_lexer.l +++ b/LuaSL/src/LuaSL_lexer.l @@ -20,21 +20,19 @@ %option align full HEX [[:xdigit:]] -NAME [[:alpha:]](_|[[:alpha:]]|[[:digit:]])* INTEGER [[:digit:]]+ EXPONANT [eE][+-]?{INTEGER} FLOAT {INTEGER}("."{INTEGER})?{EXPONANT}? +NAME [[:alpha:]](_|[[:alpha:]]|[[:digit:]])* %% - /* Basic tokens */ + /* The order here is important, in mysterious ways. The more specific the lower in case of ambiguities like "floats contain integers". I think, not tested that well yet. */ + + /* White space. */ [[:space:]]+ %{ /* ECHO; yylval->spaceValue = strdup(yytext); return LSL_SPACE; */ %} -{NAME} %{ ECHO; /* yylval->nameValue = strdup(yytext); return LSL_NAME; */ %} -{INTEGER} %{ ECHO; yylval->integerValue = atoi(yytext); return LSL_INTEGER; %} -{FLOAT} %{ ECHO; /* yylval->floatValue = atof(yytext); return LSL_FLOAT; */ %} - /* Expression tokens */ -";" { ECHO; return LSL_STATEMENT; } + /* Operations. */ "&&" { ECHO; return LSL_BOOL_AND; } "||" { ECHO; return LSL_BOOL_OR; } "|" { ECHO; return LSL_BIT_OR; } @@ -58,6 +56,14 @@ FLOAT {INTEGER}("."{INTEGER})?{EXPONANT}? "(" { ECHO; return LSL_PARENTHESIS_OPEN; } ")" { ECHO; return LSL_PARENTHESIS_CLOSE; } + /* Types. */ +{INTEGER} %{ ECHO; yylval->integerValue = atoi(yytext); return LSL_INTEGER; %} +{FLOAT} %{ ECHO; /* yylval->floatValue = atof(yytext); return LSL_FLOAT; */ %} + +{NAME} %{ ECHO; /* yylval->nameValue = strdup(yytext); return LSL_NAME; */ %} + +";" { ECHO; return LSL_STATEMENT; } + <> { yyterminate(); } /* Everything else */ diff --git a/LuaSL/src/LuaSL_yaccer.y b/LuaSL/src/LuaSL_yaccer.y index 0b87df4..7f873c2 100644 --- a/LuaSL/src/LuaSL_yaccer.y +++ b/LuaSL/src/LuaSL_yaccer.y @@ -9,12 +9,11 @@ %define api.pure -%token LSL_SPACE - -%nonassoc LSL_STATEMENT -%token LSL_INTEGER +%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 @@ -23,21 +22,23 @@ %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 - %token LSL_PARENTHESIS_OPEN LSL_PARENTHESIS_CLOSE LSL_EXPRESSION +%token LSL_INTEGER -%type expr %type statement -%type ignorable +%nonassoc LSL_STATEMENT %% input : - expr { ((LuaSL_yyparseParam*)data)->ast = addOperation(LSL_EXPRESSION, $1, $1); } + ignorable { ((LuaSL_yyparseParam*)data)->ast = addSpace($1, ((LuaSL_yyparseParam*)data)->ast); } + | expr { ((LuaSL_yyparseParam*)data)->ast = addOperation(LSL_EXPRESSION, $1, $1); } | statement { ((LuaSL_yyparseParam*)data)->ast = addStatement($1, ((LuaSL_yyparseParam*)data)->ast); } - | ignorable { ((LuaSL_yyparseParam*)data)->ast = addSpace($1, ((LuaSL_yyparseParam*)data)->ast); } +; + +ignorable : + LSL_SPACE { $$ = strdup($1); } ; expr : @@ -70,9 +71,5 @@ statement : expr LSL_STATEMENT { $$ = createStatement(LSL_EXPRESSION, $1); } ; -ignorable : - LSL_SPACE { $$ = strdup($1); } -; - %% -- cgit v1.1