From ff5b1c802a26789ff769521262db79854b24939b Mon Sep 17 00:00:00 2001 From: David Walter Seikel Date: Tue, 10 Jan 2012 01:43:10 +1000 Subject: Almost got white space and comments working. Still a bug left somewhere, I think it's in operations ordering. --- LuaSL/src/LuaSL_lexer.l | 172 +++++++++++++++++++++++++++--------------------- 1 file changed, 96 insertions(+), 76 deletions(-) (limited to 'LuaSL/src/LuaSL_lexer.l') diff --git a/LuaSL/src/LuaSL_lexer.l b/LuaSL/src/LuaSL_lexer.l index 3728ab9..08a68ef 100644 --- a/LuaSL/src/LuaSL_lexer.l +++ b/LuaSL/src/LuaSL_lexer.l @@ -5,15 +5,8 @@ #include void comment(yyscan_t yyscanner); -void count(char *text); - -#ifdef LUASL_DEBUG - #undef ECHO - #define ECHO count(yytext); printf ("[%s]\n", yytext) -#else - #undef ECHO - #define ECHO count(yytext) -#endif +void common(YYSTYPE *lval, char *text, boolean checkIgnorable); +void ignorable(char *text); %} @@ -35,85 +28,84 @@ NAME [[:alpha:]](_|[[:alpha:]]|[[:digit:]])* /* 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; */ %} -"/*" %{ ECHO; comment(yyscanner); %} -"//"[^\n]* %{ ECHO; /* consume //-comment */ %} + /* Ignorables. */ +[[:space:]]+ %{ common(yylval, yytext, FALSE); ignorable(yytext); %} + /* Yes I know this will have problems with huge comments, just being simple to get it to work for now. */ +"/*"([^"*/"]*)"*/" %{ common(yylval, yytext, FALSE); ignorable(yytext); %} +"//"[^\n]* %{ common(yylval, yytext, FALSE); ignorable(yytext); %} /* Operations. */ -"&&" { ECHO; return LSL_BOOL_AND; } -"||" { ECHO; return LSL_BOOL_OR; } -"|" { ECHO; return LSL_BIT_OR; } -"^" { ECHO; return LSL_BIT_XOR; } -"&" { ECHO; return LSL_BIT_AND; } -"!=" { ECHO; return LSL_NOT_EQUAL; } -"==" { ECHO; return LSL_EQUAL; } -">=" { ECHO; return LSL_GREATER_EQUAL; } -"<=" { ECHO; return LSL_LESS_EQUAL; } -">" { ECHO; return LSL_GREATER_THAN; } -"<" { ECHO; return LSL_LESS_THAN; } -">>" { ECHO; return LSL_RIGHT_SHIFT; } -"<<" { ECHO; return LSL_LEFT_SHIFT; } -"+" { ECHO; return LSL_ADD; } -"-" { ECHO; return LSL_SUBTRACT; } -"*" { ECHO; return LSL_MULTIPLY; } -"%" { ECHO; return LSL_MODULO; } -"/" { 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; } +"&&" { common(yylval, yytext, TRUE); return LSL_BOOL_AND; } +"||" { common(yylval, yytext, TRUE); return LSL_BOOL_OR; } +"|" { common(yylval, yytext, TRUE); return LSL_BIT_OR; } +"^" { common(yylval, yytext, TRUE); return LSL_BIT_XOR; } +"&" { common(yylval, yytext, TRUE); return LSL_BIT_AND; } +"!=" { common(yylval, yytext, TRUE); return LSL_NOT_EQUAL; } +"==" { common(yylval, yytext, TRUE); return LSL_EQUAL; } +">=" { common(yylval, yytext, TRUE); return LSL_GREATER_EQUAL; } +"<=" { common(yylval, yytext, TRUE); return LSL_LESS_EQUAL; } +">" { common(yylval, yytext, TRUE); return LSL_GREATER_THAN; } +"<" { common(yylval, yytext, TRUE); return LSL_LESS_THAN; } +">>" { common(yylval, yytext, TRUE); return LSL_RIGHT_SHIFT; } +"<<" { common(yylval, yytext, TRUE); return LSL_LEFT_SHIFT; } +"+" { common(yylval, yytext, TRUE); return LSL_ADD; } +"-" { common(yylval, yytext, TRUE); return LSL_SUBTRACT; } +"*" { common(yylval, yytext, TRUE); return LSL_MULTIPLY; } +"%" { common(yylval, yytext, TRUE); return LSL_MODULO; } +"/" { common(yylval, yytext, TRUE); return LSL_DIVIDE; } +"!" { common(yylval, yytext, TRUE); return LSL_BOOL_NOT; } +"~" { common(yylval, yytext, TRUE); return LSL_BIT_NOT; } +"[" { common(yylval, yytext, TRUE); return LSL_BRACKET_OPEN; } +"]" { common(yylval, yytext, TRUE); return LSL_BRACKET_CLOSE; } +"(" { common(yylval, yytext, TRUE); return LSL_PARENTHESIS_OPEN; } +")" { common(yylval, yytext, TRUE); return LSL_PARENTHESIS_CLOSE; } +"+=" { common(yylval, yytext, TRUE); return LSL_ASSIGNMENT_ADD; } +"-=" { common(yylval, yytext, TRUE); return LSL_ASSIGNMENT_SUBTRACT; } +"*=" { common(yylval, yytext, TRUE); return LSL_ASSIGNMENT_MULTIPLY; } +"%=" { common(yylval, yytext, TRUE); return LSL_ASSIGNMENT_MODULO; } +"/=" { common(yylval, yytext, TRUE); return LSL_ASSIGNMENT_DIVIDE; } +"=" { common(yylval, yytext, TRUE); return LSL_ASSIGNMENT_PLAIN; } +"." { common(yylval, yytext, TRUE); return LSL_DOT; } +"--" { common(yylval, yytext, TRUE); return LSL_DECREMENT_PRE; } +"++" { common(yylval, yytext, TRUE); return LSL_INCREMENT_PRE; } +"," { common(yylval, yytext, TRUE); return LSL_COMMA; } /* Types. */ -{INTEGER} %{ ECHO; yylval->integerValue = atoi(yytext); return LSL_INTEGER; %} -{FLOAT} %{ ECHO; yylval->floatValue = atof(yytext); return LSL_FLOAT; %} +{INTEGER} %{ common(yylval, yytext, TRUE); yylval->value.integerValue = atoi(yytext); return LSL_INTEGER; %} +{FLOAT} %{ common(yylval, yytext, TRUE); yylval->value.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; %} -"quaternion" %{ ECHO; return LSL_TYPE_ROTATION; %} -"rotation" %{ ECHO; return LSL_TYPE_ROTATION; %} -"string" %{ ECHO; return LSL_TYPE_STRING; %} -"vector" %{ ECHO; return LSL_TYPE_VECTOR; %} +"float" %{ common(yylval, yytext, TRUE); return LSL_TYPE_FLOAT; %} +"integer" %{ common(yylval, yytext, TRUE); return LSL_TYPE_INTEGER; %} +"key" %{ common(yylval, yytext, TRUE); return LSL_TYPE_KEY; %} +"list" %{ common(yylval, yytext, TRUE); return LSL_TYPE_LIST; %} +"quaternion" %{ common(yylval, yytext, TRUE); return LSL_TYPE_ROTATION; %} +"rotation" %{ common(yylval, yytext, TRUE); return LSL_TYPE_ROTATION; %} +"string" %{ common(yylval, yytext, TRUE); return LSL_TYPE_STRING; %} +"vector" %{ common(yylval, yytext, TRUE); 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; %} +"do" %{ common(yylval, yytext, TRUE); return LSL_DO; %} +"for" %{ common(yylval, yytext, TRUE); return LSL_FOR; %} +"else" %{ common(yylval, yytext, TRUE); return LSL_ELSE; %} +"if" %{ common(yylval, yytext, TRUE); return LSL_IF; %} +"jump" %{ common(yylval, yytext, TRUE); return LSL_JUMP; %} +"return" %{ common(yylval, yytext, TRUE); return LSL_RETURN; %} +"state" %{ common(yylval, yytext, TRUE); return LSL_STATE_CHANGE; %} +"while" %{ common(yylval, yytext, TRUE); return LSL_WHILE; %} -{NAME} %{ ECHO; /* yylval->nameValue = strdup(yytext); return LSL_NAME; */ %} +{NAME} %{ common(yylval, yytext, TRUE); /* yylval->value.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; } +"@" %{ common(yylval, yytext, TRUE); return LSL_LABEL; %} +"{" %{ common(yylval, yytext, TRUE); return LSL_BLOCK_OPEN; %} +"}" %{ common(yylval, yytext, TRUE); return LSL_BLOCK_CLOSE; %} +";" %{ common(yylval, yytext, TRUE); return LSL_STATEMENT; %} <> { yyterminate(); } /* Everything else */ -. %{ ECHO; printf(" unexpected character.\n"); %} +. %{ common(yylval, yytext, TRUE); printf(" unexpected character.\n"); %} %% @@ -130,10 +122,11 @@ void comment(yyscan_t yyscanner) yyerror("unterminated comment"); } -int column = 0; -int line = 0; +static char *ignorableText = NULL; +static int column = 0; +static int line = 0; -void count(char *text) +void common(YYSTYPE *lval, char *text, boolean checkIgnorable) { int i; @@ -147,6 +140,33 @@ void count(char *text) column += 8 - (column % 8); else column++; + + lval->line = line; + lval->column = column; + + if (checkIgnorable) + { + lval->ignorableText = ignorableText; + ignorableText = NULL; + } + +#ifdef LUASL_DEBUG + printf ("%04d, %04d [%s]\n", line, column, text); +#endif +} + +void ignorable(char *text) +{ + if (ignorableText) + { + int lenI = strlen(ignorableText); + int lenT = strlen(text); + + ignorableText = realloc(ignorableText, lenI + lenT + 1); + sprintf(&ignorableText[lenI], "%s", text); + } + else + ignorableText = strdup(text); } int yyerror(const char *msg) -- cgit v1.1