diff options
author | David Walter Seikel | 2012-01-10 01:43:10 +1000 |
---|---|---|
committer | David Walter Seikel | 2012-01-10 01:43:10 +1000 |
commit | ff5b1c802a26789ff769521262db79854b24939b (patch) | |
tree | 609c9ff857c837bf84d9dd71fe5c1fb7cf3778fd /LuaSL/src/LuaSL_lexer.l | |
parent | Hmmm, we have a circular dependencie with the include fiels each of flex and ... (diff) | |
download | SledjHamr-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.l | 172 |
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 | ||
7 | void comment(yyscan_t yyscanner); | 7 | void comment(yyscan_t yyscanner); |
8 | void count(char *text); | 8 | void common(YYSTYPE *lval, char *text, boolean checkIgnorable); |
9 | 9 | void 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 | ||
133 | int column = 0; | 125 | static char *ignorableText = NULL; |
134 | int line = 0; | 126 | static int column = 0; |
127 | static int line = 0; | ||
135 | 128 | ||
136 | void count(char *text) | 129 | void 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 | |||
158 | void 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 | ||
152 | int yyerror(const char *msg) | 172 | int yyerror(const char *msg) |