blob: 4aff7fa6bc926e6c4a134b423a93942cd5d3ea91 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
|
%{
#define excludeLexer
#include "LuaSL_LSL_tree.h"
#ifdef LUASL_DEBUG
#undef ECHO
#define ECHO printf ("[%s]\n", yytext)
#else
#undef ECHO
#define ECHO {}
#endif
%}
%option reentrant never-interactive batch
%option bison-bridge yylineno 8bit
%option noreject noyymore
%option backup debug perf-report perf-report verbose warn
%option align full
HEX [[:xdigit:]]
INTEGER [[:digit:]]+
EXPONANT [eE][+-]?{INTEGER}
FLOAT {INTEGER}("."{INTEGER})?{EXPONANT}?
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; */ %}
/* 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; }
/* Types. */
{INTEGER} %{ ECHO; yylval->integerValue = atoi(yytext); return LSL_INTEGER; %}
{FLOAT} %{ ECHO; yylval->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; %}
/* 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; %}
{NAME} %{ ECHO; /* yylval->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; }
<<EOF>> { yyterminate(); }
/* Everything else */
. %{ ECHO; printf(" unexpected character.\n"); %}
%%
int yywrap(yyscan_t yyscanner)
{
#ifdef FLEX_SCANNER
#ifndef LL_WINDOWS
// Get gcc to stop complaining about lack of use of yyunput and input.
(void) yyunput;
(void) input;
#endif
#endif
// TODO - If we are getting files from stdin, or multiple -f arguments, we should loop through them and return 0. Return 1 when there are no more files.
return(1);
}
|