diff options
Diffstat (limited to 'dimension/lexer.l')
-rw-r--r-- | dimension/lexer.l | 494 |
1 files changed, 0 insertions, 494 deletions
diff --git a/dimension/lexer.l b/dimension/lexer.l deleted file mode 100644 index 89cc0a7..0000000 --- a/dimension/lexer.l +++ /dev/null @@ -1,494 +0,0 @@ -/************************************************************************* - * Copyright (C) 2009-2010 Tavian Barnes <tavianator@tavianator.com> * - * * - * This file is part of Dimension. * - * * - * Dimension is free software; you can redistribute it and/or modify it * - * under the terms of the GNU General Public License as published by the * - * Free Software Foundation; either version 3 of the License, or (at * - * your option) any later version. * - * * - * Dimension is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see <http://www.gnu.org/licenses/>. * - *************************************************************************/ - -%option reentrant -%option stack -%option yylineno -%option noyywrap -%option never-interactive -%option prefix="dmnsn_yy" -%option outfile="lex.yy.c" - -%{ -#include "parse.h" -#include "tokenize.h" -#include "utility.h" -#include <stdlib.h> -#include <stdio.h> - -#define YY_DECL int dmnsn_yylex_impl(dmnsn_parse_item *lvalp, \ - dmnsn_parse_location *llocp, \ - const char *filename, \ - yyscan_t yyscanner) -%} - -%x DMNSN_BLOCK_COMMENT -%x DMNSN_LINE_COMMENT -%x DMNSN_STRING -%x DMNSN_STRING_ESCAPE - -%% - -%{ -/* Some helpful macros that set fields of a token correctly, and other stuff */ - -#define NEW_TOKEN(token_type) \ - do { \ - token = token_type; \ - lvalp->value = NULL; \ - llocp->first_filename = llocp->last_filename = filename; \ - llocp->first_line = llocp->last_line = yylineno; \ - llocp->first_column = yycolumn; \ - llocp->last_column = yycolumn + yyleng; \ - llocp->parent = NULL; \ - } while (0) - -#define CALCULATE_COLUMN() do { yycolumn += yyleng; } while (0) - -#define RETURN() \ - do { \ - CALCULATE_COLUMN(); \ - return token; \ - } while (0) - -#define RETURN_TOKEN(token_type) \ - do { \ - NEW_TOKEN(token_type); \ - RETURN(); \ - } while (0) - -#define RETURN_VALUE_TOKEN(token_type) \ - do { \ - NEW_TOKEN(token_type); \ - lvalp->value = dmnsn_strdup(yytext); \ - RETURN(); \ - } while (0) - -#define STRING_TOKEN() \ - do { \ - NEW_TOKEN(DMNSN_T_STRING); \ - lvalp->value = dmnsn_malloc(string_extent); \ - lvalp->value[0] = '\0'; \ - CALCULATE_COLUMN(); \ - } while (0) - -#define STRCAT(str, len) \ - do { \ - if (string_length + len + 1 >= string_length) { \ - string_extent = 2*(string_length + len + 1); \ - lvalp->value = dmnsn_realloc(lvalp->value, string_extent); \ - } \ - \ - strncpy(lvalp->value + string_length, str, len + 1); \ - string_length += len; \ - CALCULATE_COLUMN(); \ - } while(0) - -int token = DMNSN_T_LEX_ERROR; -size_t string_length = 0, string_extent = 8; -unsigned int wchar; - -/* Silence some warnings */ -(void)yyunput; -(void)input; -(void)yy_top_state; -%} - -(?# Comments) - -<INITIAL,DMNSN_BLOCK_COMMENT>"/*" { - yy_push_state(DMNSN_BLOCK_COMMENT, yyscanner); - CALCULATE_COLUMN(); -} -<DMNSN_BLOCK_COMMENT>"*/" CALCULATE_COLUMN(); yy_pop_state(yyscanner); -<DMNSN_BLOCK_COMMENT>[^*/\n]* CALCULATE_COLUMN(); -<DMNSN_BLOCK_COMMENT>"/" CALCULATE_COLUMN(); -<DMNSN_BLOCK_COMMENT>"*" CALCULATE_COLUMN(); -<DMNSN_BLOCK_COMMENT>\n ; - -"//" { - yy_push_state(DMNSN_LINE_COMMENT, yyscanner); - CALCULATE_COLUMN(); -} -<DMNSN_LINE_COMMENT>\n ; yy_pop_state(yyscanner); -<DMNSN_LINE_COMMENT>[^\n]+ CALCULATE_COLUMN(); - -(?# Punctuation) -"{" RETURN_TOKEN(DMNSN_T_LBRACE); -"}" RETURN_TOKEN(DMNSN_T_RBRACE); -"(" RETURN_TOKEN(DMNSN_T_LPAREN); -")" RETURN_TOKEN(DMNSN_T_RPAREN); -"[" RETURN_TOKEN(DMNSN_T_LBRACKET); -"]" RETURN_TOKEN(DMNSN_T_RBRACKET); -"+" RETURN_TOKEN(DMNSN_T_PLUS); -"-" RETURN_TOKEN(DMNSN_T_MINUS); -"*" RETURN_TOKEN(DMNSN_T_STAR); -"/" RETURN_TOKEN(DMNSN_T_SLASH); -"," RETURN_TOKEN(DMNSN_T_COMMA); -";" RETURN_TOKEN(DMNSN_T_SEMICOLON); -"?" RETURN_TOKEN(DMNSN_T_QUESTION); -":" RETURN_TOKEN(DMNSN_T_COLON); -"&" RETURN_TOKEN(DMNSN_T_AND); -"." RETURN_TOKEN(DMNSN_T_DOT); -"|" RETURN_TOKEN(DMNSN_T_PIPE); -"<" RETURN_TOKEN(DMNSN_T_LESS); -">" RETURN_TOKEN(DMNSN_T_GREATER); -"!" RETURN_TOKEN(DMNSN_T_BANG); -"=" RETURN_TOKEN(DMNSN_T_EQUALS); -"<=" RETURN_TOKEN(DMNSN_T_LESS_EQUAL); -">=" RETURN_TOKEN(DMNSN_T_GREATER_EQUAL); -"!=" RETURN_TOKEN(DMNSN_T_NOT_EQUAL); - -(?# Integers) -[[:digit:]]+ | -0(x|X)[[:digit:]aAbBcCdDeEfF]+ RETURN_VALUE_TOKEN(DMNSN_T_INTEGER); - -(?# Floats) -[[:digit:]]*\.?[[:digit:]]+((e|E)(\+|-)?[[:digit:]]+)? { - RETURN_VALUE_TOKEN(DMNSN_T_FLOAT); -} - -(?# Keywords) -"abs" RETURN_TOKEN(DMNSN_T_ABS); -"acos" RETURN_TOKEN(DMNSN_T_ACOS); -"acosh" RETURN_TOKEN(DMNSN_T_ACOSH); -"adc_bailout" RETURN_TOKEN(DMNSN_T_ADC_BAILOUT); -"ambient" RETURN_TOKEN(DMNSN_T_AMBIENT); -"ambient_light" RETURN_TOKEN(DMNSN_T_AMBIENT_LIGHT); -"angle" RETURN_TOKEN(DMNSN_T_ANGLE); -"asc" RETURN_TOKEN(DMNSN_T_ASC); -"ascii" RETURN_TOKEN(DMNSN_T_ASCII); -"asin" RETURN_TOKEN(DMNSN_T_ASIN); -"asinh" RETURN_TOKEN(DMNSN_T_ASINH); -"assumed_gamma" RETURN_TOKEN(DMNSN_T_ASSUMED_GAMMA); -"atan" RETURN_TOKEN(DMNSN_T_ATAN); -"atan2" RETURN_TOKEN(DMNSN_T_ATAN2); -"atanh" RETURN_TOKEN(DMNSN_T_ATANH); -"background" RETURN_TOKEN(DMNSN_T_BACKGROUND); -"box" RETURN_TOKEN(DMNSN_T_BOX); -"blue" RETURN_TOKEN(DMNSN_T_BLUE); -"ceil" RETURN_TOKEN(DMNSN_T_CEIL); -"camera" RETURN_TOKEN(DMNSN_T_CAMERA); -"charset" RETURN_TOKEN(DMNSN_T_CHARSET); -"checker" RETURN_TOKEN(DMNSN_T_CHECKER); -"color" RETURN_TOKEN(DMNSN_T_COLOR); -"color_map" RETURN_TOKEN(DMNSN_T_COLOR_MAP); -"colour" RETURN_TOKEN(DMNSN_T_COLOR); -"colour_map" RETURN_TOKEN(DMNSN_T_COLOR_MAP); -"cone" RETURN_TOKEN(DMNSN_T_CONE); -"cos" RETURN_TOKEN(DMNSN_T_COS); -"cosh" RETURN_TOKEN(DMNSN_T_COSH); -"cylinder" RETURN_TOKEN(DMNSN_T_CYLINDER); -"degrees" RETURN_TOKEN(DMNSN_T_DEGREES); -"difference" RETURN_TOKEN(DMNSN_T_DIFFERENCE); -"diffuse" RETURN_TOKEN(DMNSN_T_DIFFUSE); -"direction" RETURN_TOKEN(DMNSN_T_DIRECTION); -"div" RETURN_TOKEN(DMNSN_T_DIV); -"exp" RETURN_TOKEN(DMNSN_T_EXP); -"falloff" RETURN_TOKEN(DMNSN_T_FALLOFF); -"false" RETURN_TOKEN(DMNSN_T_FALSE); -"filter" RETURN_TOKEN(DMNSN_T_FILTER); -"finish" RETURN_TOKEN(DMNSN_T_FINISH); -"floor" RETURN_TOKEN(DMNSN_T_FLOOR); -"global_settings" RETURN_TOKEN(DMNSN_T_GLOBAL_SETTINGS); -"gradient" RETURN_TOKEN(DMNSN_T_GRADIENT); -"gray" RETURN_TOKEN(DMNSN_T_GRAY); -"grey" RETURN_TOKEN(DMNSN_T_GRAY); -"green" RETURN_TOKEN(DMNSN_T_GREEN); -"image_height" RETURN_TOKEN(DMNSN_T_IMAGE_HEIGHT); -"image_map" RETURN_TOKEN(DMNSN_T_IMAGE_MAP); -"image_width" RETURN_TOKEN(DMNSN_T_IMAGE_WIDTH); -"int" RETURN_TOKEN(DMNSN_T_INT); -"interior" RETURN_TOKEN(DMNSN_T_INTERIOR); -"intersection" RETURN_TOKEN(DMNSN_T_INTERSECTION); -"inverse" RETURN_TOKEN(DMNSN_T_INVERSE); -"ior" RETURN_TOKEN(DMNSN_T_IOR); -"ln" RETURN_TOKEN(DMNSN_T_LN); -"location" RETURN_TOKEN(DMNSN_T_LOCATION); -"log" RETURN_TOKEN(DMNSN_T_LOG); -"look_at" RETURN_TOKEN(DMNSN_T_LOOK_AT); -"light_source" RETURN_TOKEN(DMNSN_T_LIGHT_SOURCE); -"matrix" RETURN_TOKEN(DMNSN_T_MATRIX); -"max" RETURN_TOKEN(DMNSN_T_MAX); -"max_intersections" RETURN_TOKEN(DMNSN_T_MAX_INTERSECTIONS); -"max_trace_level" RETURN_TOKEN(DMNSN_T_MAX_TRACE_LEVEL); -"merge" RETURN_TOKEN(DMNSN_T_MERGE); -"min" RETURN_TOKEN(DMNSN_T_MIN); -"mod" RETURN_TOKEN(DMNSN_T_MOD); -"no" RETURN_TOKEN(DMNSN_T_NO); -"object" RETURN_TOKEN(DMNSN_T_OBJECT); -"off" RETURN_TOKEN(DMNSN_T_OFF); -"on" RETURN_TOKEN(DMNSN_T_ON); -"open" RETURN_TOKEN(DMNSN_T_OPEN); -"perspective" RETURN_TOKEN(DMNSN_T_PERSPECTIVE); -"phong" RETURN_TOKEN(DMNSN_T_PHONG); -"phong_size" RETURN_TOKEN(DMNSN_T_PHONG_SIZE); -"pi" RETURN_TOKEN(DMNSN_T_PI); -"pigment" RETURN_TOKEN(DMNSN_T_PIGMENT); -"pigment_map" RETURN_TOKEN(DMNSN_T_PIGMENT_MAP); -"plane" RETURN_TOKEN(DMNSN_T_PLANE); -"png" RETURN_TOKEN(DMNSN_T_PNG); -"pow" RETURN_TOKEN(DMNSN_T_POW); -"quick_color" RETURN_TOKEN(DMNSN_T_QUICK_COLOR); -"quick_colour" RETURN_TOKEN(DMNSN_T_QUICK_COLOR); -"radians" RETURN_TOKEN(DMNSN_T_RADIANS); -"red" RETURN_TOKEN(DMNSN_T_RED); -"reflection" RETURN_TOKEN(DMNSN_T_REFLECTION); -"rgb" RETURN_TOKEN(DMNSN_T_RGB); -"rgbf" RETURN_TOKEN(DMNSN_T_RGBF); -"rgbft" RETURN_TOKEN(DMNSN_T_RGBFT); -"rgbt" RETURN_TOKEN(DMNSN_T_RGBT); -"right" RETURN_TOKEN(DMNSN_T_RIGHT); -"rotate" RETURN_TOKEN(DMNSN_T_ROTATE); -"scale" RETURN_TOKEN(DMNSN_T_SCALE); -"sin" RETURN_TOKEN(DMNSN_T_SIN); -"sinh" RETURN_TOKEN(DMNSN_T_SINH); -"sky" RETURN_TOKEN(DMNSN_T_SKY); -"sky_sphere" RETURN_TOKEN(DMNSN_T_SKY_SPHERE); -"sphere" RETURN_TOKEN(DMNSN_T_SPHERE); -"sqrt" RETURN_TOKEN(DMNSN_T_SQRT); -"strcmp" RETURN_TOKEN(DMNSN_T_STRCMP); -"strlen" RETURN_TOKEN(DMNSN_T_STRLEN); -"sturm" RETURN_TOKEN(DMNSN_T_STURM); -"sys" RETURN_TOKEN(DMNSN_T_SYS); -"t" RETURN_TOKEN(DMNSN_T_T); -"tan" RETURN_TOKEN(DMNSN_T_TAN); -"tanh" RETURN_TOKEN(DMNSN_T_TANH); -"texture" RETURN_TOKEN(DMNSN_T_TEXTURE); -"torus" RETURN_TOKEN(DMNSN_T_TORUS); -"transform" RETURN_TOKEN(DMNSN_T_TRANSFORM); -"translate" RETURN_TOKEN(DMNSN_T_TRANSLATE); -"transmit" RETURN_TOKEN(DMNSN_T_TRANSMIT); -"true" RETURN_TOKEN(DMNSN_T_TRUE); -"u" RETURN_TOKEN(DMNSN_T_U); -"union" RETURN_TOKEN(DMNSN_T_UNION); -"up" RETURN_TOKEN(DMNSN_T_UP); -"utf8" RETURN_TOKEN(DMNSN_T_UTF8); -"v" RETURN_TOKEN(DMNSN_T_V); -"val" RETURN_TOKEN(DMNSN_T_VAL); -"vaxis_rotate" RETURN_TOKEN(DMNSN_T_VAXIS_ROTATE); -"vcross" RETURN_TOKEN(DMNSN_T_VCROSS); -"vdot" RETURN_TOKEN(DMNSN_T_VDOT); -"vlength" RETURN_TOKEN(DMNSN_T_VLENGTH); -"vrotate" RETURN_TOKEN(DMNSN_T_VROTATE); -"vnormalize" RETURN_TOKEN(DMNSN_T_VNORMALIZE); -"x" RETURN_TOKEN(DMNSN_T_X); -"y" RETURN_TOKEN(DMNSN_T_Y); -"yes" RETURN_TOKEN(DMNSN_T_YES); -"z" RETURN_TOKEN(DMNSN_T_Z); - -(?# Directives) -#[\b\r\t\v ]*break RETURN_TOKEN(DMNSN_T_BREAK); -#[\b\r\t\v ]*case RETURN_TOKEN(DMNSN_T_CASE); -#[\b\r\t\v ]*debug RETURN_TOKEN(DMNSN_T_DEBUG); -#[\b\r\t\v ]*declare RETURN_TOKEN(DMNSN_T_DECLARE); -#[\b\r\t\v ]*default RETURN_TOKEN(DMNSN_T_DEFAULT); -#[\b\r\t\v ]*else RETURN_TOKEN(DMNSN_T_ELSE); -#[\b\r\t\v ]*end RETURN_TOKEN(DMNSN_T_END); -#[\b\r\t\v ]*error RETURN_TOKEN(DMNSN_T_ERROR); -#[\b\r\t\v ]*fclose RETURN_TOKEN(DMNSN_T_FCLOSE); -#[\b\r\t\v ]*fopen RETURN_TOKEN(DMNSN_T_FOPEN); -#[\b\r\t\v ]*if RETURN_TOKEN(DMNSN_T_IF); -#[\b\r\t\v ]*ifdef RETURN_TOKEN(DMNSN_T_IFDEF); -#[\b\r\t\v ]*ifndef RETURN_TOKEN(DMNSN_T_IFNDEF); -#[\b\r\t\v ]*include RETURN_TOKEN(DMNSN_T_INCLUDE); -#[\b\r\t\v ]*local RETURN_TOKEN(DMNSN_T_LOCAL); -#[\b\r\t\v ]*macro RETURN_TOKEN(DMNSN_T_MACRO); -#[\b\r\t\v ]*range RETURN_TOKEN(DMNSN_T_RANGE); -#[\b\r\t\v ]*read RETURN_TOKEN(DMNSN_T_READ); -#[\b\r\t\v ]*render RETURN_TOKEN(DMNSN_T_RENDER); -#[\b\r\t\v ]*statistics RETURN_TOKEN(DMNSN_T_STATISTICS); -#[\b\r\t\v ]*switch RETURN_TOKEN(DMNSN_T_SWITCH); -#[\b\r\t\v ]*undef RETURN_TOKEN(DMNSN_T_UNDEF); -#[\b\r\t\v ]*version RETURN_TOKEN(DMNSN_T_VERSION); -#[\b\r\t\v ]*warning RETURN_TOKEN(DMNSN_T_WARNING); -#[\b\r\t\v ]*while RETURN_TOKEN(DMNSN_T_WHILE); -#[\b\r\t\v ]*write RETURN_TOKEN(DMNSN_T_WRITE); -#[\b\r\t\v ]*[[:alnum:]_]* { - NEW_TOKEN(DMNSN_T_LEX_ERROR); - dmnsn_diagnostic(*llocp, "unrecognized language directive '%s'", yytext); - RETURN(); -} - -(?# Identifiers) -[[:alpha:]_][[:alnum:]_]* RETURN_VALUE_TOKEN(DMNSN_T_IDENTIFIER); - -(?# Strings) - -"\"" STRING_TOKEN(); yy_push_state(DMNSN_STRING, yyscanner); -<DMNSN_STRING>[^\\\"\n]* STRCAT(yytext, yyleng); -<DMNSN_STRING>"\"" yy_pop_state(yyscanner); RETURN(); - -(?# String escape sequences) - -<DMNSN_STRING>"\\" { - yy_push_state(DMNSN_STRING_ESCAPE, yyscanner); - CALCULATE_COLUMN(); -} -<DMNSN_STRING_ESCAPE>"a" STRCAT("\a", 1); yy_pop_state(yyscanner); -<DMNSN_STRING_ESCAPE>"b" STRCAT("\b", 1); yy_pop_state(yyscanner); -<DMNSN_STRING_ESCAPE>"f" STRCAT("\f", 1); yy_pop_state(yyscanner); -<DMNSN_STRING_ESCAPE>"n" STRCAT("\n", 1); yy_pop_state(yyscanner); -<DMNSN_STRING_ESCAPE>"r" STRCAT("\r", 1); yy_pop_state(yyscanner); -<DMNSN_STRING_ESCAPE>"t" STRCAT("\t", 1); yy_pop_state(yyscanner); -<DMNSN_STRING_ESCAPE>"v" STRCAT("\v", 1); yy_pop_state(yyscanner); -<DMNSN_STRING_ESCAPE>"\\" STRCAT("\\", 1); yy_pop_state(yyscanner); -<DMNSN_STRING_ESCAPE>"'" STRCAT("'", 1); yy_pop_state(yyscanner); -<DMNSN_STRING_ESCAPE>"\"" STRCAT("\"", 1); yy_pop_state(yyscanner); -<DMNSN_STRING_ESCAPE>"u"[[:digit:]aAbBcCdDeEfF]{4} { - dmnsn_strtoui(&wchar, yytext + 1, 16); - STRCAT("", 2); - lvalp->value[string_length - 2] = wchar/256; - lvalp->value[string_length - 1] = wchar%256; - yy_pop_state(yyscanner); -} -<DMNSN_STRING_ESCAPE>. { - dmnsn_parse_location location; - location.first_filename = location.last_filename = filename; - location.first_line = location.last_line = yylineno; - location.first_column = yycolumn; - location.last_column = yycolumn + yyleng; - dmnsn_diagnostic(location, "WARNING: unrecognised escape sequence '\\%c'", - (int)*yytext); - STRCAT(yytext, yyleng); - yy_pop_state(yyscanner); -} - -(?# Ignore whitespace) -[\b\r\t\v ]+ CALCULATE_COLUMN(); -\n ; - -(?# Fall-through) -. { - NEW_TOKEN(DMNSN_T_LEX_ERROR); - dmnsn_diagnostic(*llocp, "unrecognized character '%c' (0x%X)", - (int)*yytext, (unsigned int)(unsigned char)*yytext); - RETURN(); -} - -%% - -void * -dmnsn_yy_make_buffer(FILE *file, void *scanner) -{ - return dmnsn_yy_create_buffer(file, YY_BUF_SIZE, scanner); -} - -void * -dmnsn_yy_make_string_buffer(const char *str, void *scanner) -{ - return dmnsn_yy_scan_string(str, scanner); -} - -void -dmnsn_yy_push_buffer(void *buffer, void *scanner) -{ - dmnsn_yypush_buffer_state(buffer, scanner); -} - -void -dmnsn_yy_pop_buffer(void *scanner) -{ - dmnsn_yypop_buffer_state(scanner); -} - -dmnsn_array * -dmnsn_tokenize(FILE *file, const char *filename) -{ - dmnsn_token token; - dmnsn_parse_item item; - dmnsn_parse_location location; - dmnsn_array *tokens = dmnsn_new_array(sizeof(dmnsn_token)); - - yyscan_t scanner; - - yylex_init(&scanner); - yyset_in(file, scanner); - yyset_extra(NULL, scanner); - - while ((token.type = dmnsn_yylex_impl(&item, &location, filename, scanner)) - != 0) - { - token.value = item.value; - token.filename = location.first_filename; - token.line = location.first_line; - token.col = location.first_column; - dmnsn_array_push(tokens, &token); - } - - yylex_destroy(scanner); - return tokens; -} - -static void -dmnsn_delete_token(dmnsn_token token) -{ - dmnsn_free(token.value); -} - -void -dmnsn_delete_tokens(dmnsn_array *tokens) -{ - DMNSN_ARRAY_FOREACH (dmnsn_token *, token, tokens) { - dmnsn_delete_token(*token); - } - dmnsn_delete_array(tokens); -} - -static void -dmnsn_print_token(FILE *file, dmnsn_token token) -{ - const char *tname; - if (token.type == DMNSN_T_LPAREN) { - tname = "\\("; - } else if (token.type == DMNSN_T_RPAREN) { - tname = "\\)"; - } else if (token.type == DMNSN_T_LEX_ERROR) { - tname = "(error)"; - } else { - tname = dmnsn_token_string(token.type); - } - - if (token.value) { - fprintf(file, "(%s \"%s\")", tname, token.value); - } else { - fprintf(file, "%s", tname); - } -} - -void -dmnsn_print_token_sexpr(FILE *file, const dmnsn_array *tokens) -{ - if (dmnsn_array_size(tokens) == 0) { - fprintf(file, "()"); - } else { - fprintf(file, "("); - dmnsn_token *token = dmnsn_array_first(tokens); - dmnsn_print_token(file, *token); - - for (++token; token <= (dmnsn_token *)dmnsn_array_last(tokens); ++token) { - fprintf(file, " "); - dmnsn_print_token(file, *token); - } - - fprintf(file, ")"); - } - - fprintf(file, "\n"); -} |