aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/LuaSL/src/LuaSL_lexer.l
diff options
context:
space:
mode:
authorDavid Walter Seikel2012-01-10 01:43:10 +1000
committerDavid Walter Seikel2012-01-10 01:43:10 +1000
commitff5b1c802a26789ff769521262db79854b24939b (patch)
tree609c9ff857c837bf84d9dd71fe5c1fb7cf3778fd /LuaSL/src/LuaSL_lexer.l
parentHmmm, we have a circular dependencie with the include fiels each of flex and ... (diff)
downloadSledjHamr-ff5b1c802a26789ff769521262db79854b24939b.zip
SledjHamr-ff5b1c802a26789ff769521262db79854b24939b.tar.gz
SledjHamr-ff5b1c802a26789ff769521262db79854b24939b.tar.bz2
SledjHamr-ff5b1c802a26789ff769521262db79854b24939b.tar.xz
Almost got white space and comments working. Still a bug left somewhere, I think it's in operations ordering.
Diffstat (limited to 'LuaSL/src/LuaSL_lexer.l')
-rw-r--r--LuaSL/src/LuaSL_lexer.l172
1 files changed, 96 insertions, 76 deletions
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 @@
5#include <stdio.h> 5#include <stdio.h>
6 6
7void comment(yyscan_t yyscanner); 7void comment(yyscan_t yyscanner);
8void count(char *text); 8void common(YYSTYPE *lval, char *text, boolean checkIgnorable);
9 9void ignorable(char *text);
10#ifdef LUASL_DEBUG
11 #undef ECHO
12 #define ECHO count(yytext); printf ("[%s]\n", yytext)
13#else
14 #undef ECHO
15 #define ECHO count(yytext)
16#endif
17 10
18%} 11%}
19 12
@@ -35,85 +28,84 @@ NAME [[:alpha:]](_|[[:alpha:]]|[[:digit:]])*
35 28
36 /* 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. */ 29 /* 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. */
37 30
38 /* White space. */ 31 /* Ignorables. */
39[[:space:]]+ %{ ECHO; /* yylval->spaceValue = strdup(yytext); return LSL_SPACE; */ %} 32[[:space:]]+ %{ common(yylval, yytext, FALSE); ignorable(yytext); %}
40"/*" %{ ECHO; comment(yyscanner); %} 33 /* Yes I know this will have problems with huge comments, just being simple to get it to work for now. */
41"//"[^\n]* %{ ECHO; /* consume //-comment */ %} 34"/*"([^"*/"]*)"*/" %{ common(yylval, yytext, FALSE); ignorable(yytext); %}
35"//"[^\n]* %{ common(yylval, yytext, FALSE); ignorable(yytext); %}
42 36
43 /* Operations. */ 37 /* Operations. */
44"&&" { ECHO; return LSL_BOOL_AND; } 38"&&" { common(yylval, yytext, TRUE); return LSL_BOOL_AND; }
45"||" { ECHO; return LSL_BOOL_OR; } 39"||" { common(yylval, yytext, TRUE); return LSL_BOOL_OR; }
46"|" { ECHO; return LSL_BIT_OR; } 40"|" { common(yylval, yytext, TRUE); return LSL_BIT_OR; }
47"^" { ECHO; return LSL_BIT_XOR; } 41"^" { common(yylval, yytext, TRUE); return LSL_BIT_XOR; }
48"&" { ECHO; return LSL_BIT_AND; } 42"&" { common(yylval, yytext, TRUE); return LSL_BIT_AND; }
49"!=" { ECHO; return LSL_NOT_EQUAL; } 43"!=" { common(yylval, yytext, TRUE); return LSL_NOT_EQUAL; }
50"==" { ECHO; return LSL_EQUAL; } 44"==" { common(yylval, yytext, TRUE); return LSL_EQUAL; }
51">=" { ECHO; return LSL_GREATER_EQUAL; } 45">=" { common(yylval, yytext, TRUE); return LSL_GREATER_EQUAL; }
52"<=" { ECHO; return LSL_LESS_EQUAL; } 46"<=" { common(yylval, yytext, TRUE); return LSL_LESS_EQUAL; }
53">" { ECHO; return LSL_GREATER_THAN; } 47">" { common(yylval, yytext, TRUE); return LSL_GREATER_THAN; }
54"<" { ECHO; return LSL_LESS_THAN; } 48"<" { common(yylval, yytext, TRUE); return LSL_LESS_THAN; }
55">>" { ECHO; return LSL_RIGHT_SHIFT; } 49">>" { common(yylval, yytext, TRUE); return LSL_RIGHT_SHIFT; }
56"<<" { ECHO; return LSL_LEFT_SHIFT; } 50"<<" { common(yylval, yytext, TRUE); return LSL_LEFT_SHIFT; }
57"+" { ECHO; return LSL_ADD; } 51"+" { common(yylval, yytext, TRUE); return LSL_ADD; }
58"-" { ECHO; return LSL_SUBTRACT; } 52"-" { common(yylval, yytext, TRUE); return LSL_SUBTRACT; }
59"*" { ECHO; return LSL_MULTIPLY; } 53"*" { common(yylval, yytext, TRUE); return LSL_MULTIPLY; }
60"%" { ECHO; return LSL_MODULO; } 54"%" { common(yylval, yytext, TRUE); return LSL_MODULO; }
61"/" { ECHO; return LSL_DIVIDE; } 55"/" { common(yylval, yytext, TRUE); return LSL_DIVIDE; }
62"!" { ECHO; return LSL_BOOL_NOT; } 56"!" { common(yylval, yytext, TRUE); return LSL_BOOL_NOT; }
63"~" { ECHO; return LSL_BIT_NOT; } 57"~" { common(yylval, yytext, TRUE); return LSL_BIT_NOT; }
64 /* "<" { ECHO; return LSL_ANGLE_OPEN; } */ 58"[" { common(yylval, yytext, TRUE); return LSL_BRACKET_OPEN; }
65 /* ">" { ECHO; return LSL_ANGLE_CLOSE; } */ 59"]" { common(yylval, yytext, TRUE); return LSL_BRACKET_CLOSE; }
66"[" { ECHO; return LSL_BRACKET_OPEN; } 60"(" { common(yylval, yytext, TRUE); return LSL_PARENTHESIS_OPEN; }
67"]" { ECHO; return LSL_BRACKET_CLOSE; } 61")" { common(yylval, yytext, TRUE); return LSL_PARENTHESIS_CLOSE; }
68"(" { ECHO; return LSL_PARENTHESIS_OPEN; } 62"+=" { common(yylval, yytext, TRUE); return LSL_ASSIGNMENT_ADD; }
69")" { ECHO; return LSL_PARENTHESIS_CLOSE; } 63"-=" { common(yylval, yytext, TRUE); return LSL_ASSIGNMENT_SUBTRACT; }
70"+=" { ECHO; return LSL_ASSIGNMENT_ADD; } 64"*=" { common(yylval, yytext, TRUE); return LSL_ASSIGNMENT_MULTIPLY; }
71"-=" { ECHO; return LSL_ASSIGNMENT_SUBTRACT; } 65"%=" { common(yylval, yytext, TRUE); return LSL_ASSIGNMENT_MODULO; }
72"*=" { ECHO; return LSL_ASSIGNMENT_MULTIPLY; } 66"/=" { common(yylval, yytext, TRUE); return LSL_ASSIGNMENT_DIVIDE; }
73"%=" { ECHO; return LSL_ASSIGNMENT_MODULO; } 67"=" { common(yylval, yytext, TRUE); return LSL_ASSIGNMENT_PLAIN; }
74"/=" { ECHO; return LSL_ASSIGNMENT_DIVIDE; } 68"." { common(yylval, yytext, TRUE); return LSL_DOT; }
75"=" { ECHO; return LSL_ASSIGNMENT_PLAIN; } 69"--" { common(yylval, yytext, TRUE); return LSL_DECREMENT_PRE; }
76"." { ECHO; return LSL_DOT; } 70"++" { common(yylval, yytext, TRUE); return LSL_INCREMENT_PRE; }
77"--" { ECHO; return LSL_DECREMENT_PRE; } 71"," { common(yylval, yytext, TRUE); return LSL_COMMA; }
78"++" { ECHO; return LSL_INCREMENT_PRE; }
79"," { ECHO; return LSL_COMMA; }
80 72
81 /* Types. */ 73 /* Types. */
82{INTEGER} %{ ECHO; yylval->integerValue = atoi(yytext); return LSL_INTEGER; %} 74{INTEGER} %{ common(yylval, yytext, TRUE); yylval->value.integerValue = atoi(yytext); return LSL_INTEGER; %}
83{FLOAT} %{ ECHO; yylval->floatValue = atof(yytext); return LSL_FLOAT; %} 75{FLOAT} %{ common(yylval, yytext, TRUE); yylval->value.floatValue = atof(yytext); return LSL_FLOAT; %}
84 76
85 /* Type keywords. */ 77 /* Type keywords. */
86"float" %{ ECHO; return LSL_TYPE_FLOAT; %} 78"float" %{ common(yylval, yytext, TRUE); return LSL_TYPE_FLOAT; %}
87"integer" %{ ECHO; return LSL_TYPE_INTEGER; %} 79"integer" %{ common(yylval, yytext, TRUE); return LSL_TYPE_INTEGER; %}
88"key" %{ ECHO; return LSL_TYPE_KEY; %} 80"key" %{ common(yylval, yytext, TRUE); return LSL_TYPE_KEY; %}
89"list" %{ ECHO; return LSL_TYPE_LIST; %} 81"list" %{ common(yylval, yytext, TRUE); return LSL_TYPE_LIST; %}
90"quaternion" %{ ECHO; return LSL_TYPE_ROTATION; %} 82"quaternion" %{ common(yylval, yytext, TRUE); return LSL_TYPE_ROTATION; %}
91"rotation" %{ ECHO; return LSL_TYPE_ROTATION; %} 83"rotation" %{ common(yylval, yytext, TRUE); return LSL_TYPE_ROTATION; %}
92"string" %{ ECHO; return LSL_TYPE_STRING; %} 84"string" %{ common(yylval, yytext, TRUE); return LSL_TYPE_STRING; %}
93"vector" %{ ECHO; return LSL_TYPE_VECTOR; %} 85"vector" %{ common(yylval, yytext, TRUE); return LSL_TYPE_VECTOR; %}
94 86
95 /* Statement keywords. */ 87 /* Statement keywords. */
96"do" %{ ECHO; return LSL_DO; %} 88"do" %{ common(yylval, yytext, TRUE); return LSL_DO; %}
97"for" %{ ECHO; return LSL_FOR; %} 89"for" %{ common(yylval, yytext, TRUE); return LSL_FOR; %}
98"else" %{ ECHO; return LSL_ELSE; %} 90"else" %{ common(yylval, yytext, TRUE); return LSL_ELSE; %}
99"if" %{ ECHO; return LSL_IF; %} 91"if" %{ common(yylval, yytext, TRUE); return LSL_IF; %}
100"jump" %{ ECHO; return LSL_JUMP; %} 92"jump" %{ common(yylval, yytext, TRUE); return LSL_JUMP; %}
101"return" %{ ECHO; return LSL_RETURN; %} 93"return" %{ common(yylval, yytext, TRUE); return LSL_RETURN; %}
102"state" %{ ECHO; return LSL_STATE_CHANGE; %} 94"state" %{ common(yylval, yytext, TRUE); return LSL_STATE_CHANGE; %}
103"while" %{ ECHO; return LSL_WHILE; %} 95"while" %{ common(yylval, yytext, TRUE); return LSL_WHILE; %}
104 96
105{NAME} %{ ECHO; /* yylval->nameValue = strdup(yytext); return LSL_NAME; */ %} 97{NAME} %{ common(yylval, yytext, TRUE); /* yylval->value.nameValue = strdup(yytext); return LSL_NAME; */ %}
106 98
107 /* Other symbols. */ 99 /* Other symbols. */
108"@" %{ ECHO; return LSL_LABEL; %} 100"@" %{ common(yylval, yytext, TRUE); return LSL_LABEL; %}
109"{" %{ ECHO; return LSL_BLOCK_OPEN; %} 101"{" %{ common(yylval, yytext, TRUE); return LSL_BLOCK_OPEN; %}
110"}" %{ ECHO; return LSL_BLOCK_CLOSE; %} 102"}" %{ common(yylval, yytext, TRUE); return LSL_BLOCK_CLOSE; %}
111";" { ECHO; return LSL_STATEMENT; } 103";" %{ common(yylval, yytext, TRUE); return LSL_STATEMENT; %}
112 104
113<<EOF>> { yyterminate(); } 105<<EOF>> { yyterminate(); }
114 106
115 /* Everything else */ 107 /* Everything else */
116. %{ ECHO; printf(" unexpected character.\n"); %} 108. %{ common(yylval, yytext, TRUE); printf(" unexpected character.\n"); %}
117 109
118%% 110%%
119 111
@@ -130,10 +122,11 @@ void comment(yyscan_t yyscanner)
130 yyerror("unterminated comment"); 122 yyerror("unterminated comment");
131} 123}
132 124
133int column = 0; 125static char *ignorableText = NULL;
134int line = 0; 126static int column = 0;
127static int line = 0;
135 128
136void count(char *text) 129void common(YYSTYPE *lval, char *text, boolean checkIgnorable)
137{ 130{
138 int i; 131 int i;
139 132
@@ -147,6 +140,33 @@ void count(char *text)
147 column += 8 - (column % 8); 140 column += 8 - (column % 8);
148 else 141 else
149 column++; 142 column++;
143
144 lval->line = line;
145 lval->column = column;
146
147 if (checkIgnorable)
148 {
149 lval->ignorableText = ignorableText;
150 ignorableText = NULL;
151 }
152
153#ifdef LUASL_DEBUG
154 printf ("%04d, %04d [%s]\n", line, column, text);
155#endif
156}
157
158void ignorable(char *text)
159{
160 if (ignorableText)
161 {
162 int lenI = strlen(ignorableText);
163 int lenT = strlen(text);
164
165 ignorableText = realloc(ignorableText, lenI + lenT + 1);
166 sprintf(&ignorableText[lenI], "%s", text);
167 }
168 else
169 ignorableText = strdup(text);
150} 170}
151 171
152int yyerror(const char *msg) 172int yyerror(const char *msg)