Branch data Line data Source code
1 : :
2 : : %{
3 : : /*
4 : : * lexer for parsing resource source files (*.src)
5 : : *
6 : : */
7 : :
8 : : /* enlarge token buffer to tokenize whole strings */
9 : : #undef YYLMAX
10 : : #define YYLMAX 64000
11 : :
12 : : /* to enable debug output define LEXDEBUG */
13 : : #define LEXDEBUG 1
14 : : #ifdef LEXDEBUG
15 : : #define OUTPUT fprintf
16 : : #else
17 : : #define OUTPUT(Par1,Par2);
18 : : #endif
19 : :
20 : : /* table of possible token ids */
21 : : #include "tokens.h"
22 : : #include <stdlib.h>
23 : : #include <stdio.h>
24 : :
25 : : #include "sal/main.h"
26 : :
27 : : #if defined __GNUC__
28 : : #if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 2))
29 : : #pragma GCC diagnostic ignored "-Wunused-function"
30 : : #pragma GCC diagnostic ignored "-Wunused-label"
31 : : #endif
32 : : #if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6))
33 : : #pragma GCC diagnostic ignored "-Wunused-but-set-variable"
34 : : #endif
35 : : #elif defined __SINPRO_CC
36 : : #pragma disable_warn
37 : : #elif defined _MSC_VER
38 : : #pragma warning(push, 1)
39 : : #endif
40 : :
41 : : /* external functions (C++ code, declared as extern "C" */
42 : : extern "C" int WorkOnTokenSet( int, char* );
43 : : extern "C" FILE * init(int, char **);
44 : : extern "C" int SetError();
45 : : extern "C" int GetError();
46 : : extern "C" void Close();
47 : :
48 : : /* forwards */
49 : : void YYWarning();
50 : : %}
51 : :
52 : : %option yylineno
53 : : %option never-interactive
54 : :
55 : : %p 24000
56 : : %e 1200
57 : : %n 500
58 : :
59 : : %%
60 : :
61 : : ^[\t ]*"#pragma".* {
62 : 0 : WorkOnTokenSet( PRAGMA, yytext );
63 : : }
64 : 0 :
65 : : ^[ \t]*\n {
66 : 0 : WorkOnTokenSet( EMPTYLINE, yytext );
67 : 0 : }
68 : 0 :
69 : : [\t ]+ |
70 : : ^[\t ]*"#include".* |
71 : : ^[\t ]*"#undef".* |
72 : : "//".* |
73 : : ";" |
74 : : "<" |
75 : : ">" |
76 : : \n {
77 : 0 : WorkOnTokenSet( IGNOREDTOKENS, yytext );
78 : 0 : }
79 : 0 : "/*" {
80 : 0 : char c1 = 0,c2 = yyinput();
81 : 0 : char pChar[2];
82 : 0 : pChar[1] = 0x00;
83 : 0 : pChar[0] = c2;
84 : :
85 : 0 : WorkOnTokenSet( COMMEND, yytext );
86 : 0 : WorkOnTokenSet( COMMEND, pChar );
87 : 0 : for(;;) {
88 : 0 : if ( c2 == EOF )
89 : 0 : break;
90 : 0 : if ( c1 == '*' && c2 == '/' )
91 : 0 : break;
92 : 0 : c1 = c2;
93 : 0 : c2 = yyinput();
94 : 0 : pChar[0] = c2;
95 : 0 : WorkOnTokenSet( COMMEND, pChar );
96 : : }
97 : : }
98 : 0 :
99 : : ^[\t ]*"#ifndef".+$ |
100 : 0 : ^[\t ]*"#ifdef".+$ |
101 : 0 : ^[\t ]*"#if".+$ |
102 : 0 : ^[\t ]*"#elif".*$ |
103 : 0 : ^[\t ]*"#else".*$ |
104 : : ^[\t ]*"#endif".*$ {
105 : 0 : WorkOnTokenSet( CONDITION, yytext );
106 : : }
107 : 0 :
108 : : [a-zA-Z]+[\t ]+[^={\n]+[\t ] {
109 : 0 : /* defined Res */
110 : 0 : WorkOnTokenSet( DEFINEDRES, yytext );
111 : : }
112 : 0 :
113 : : [a-zA-Z]+[ \t]+[^={;\n]+\n[ \t]*"#".*\n[ \t]*"{" |
114 : : [a-zA-Z]+[ \t]+[^={;\n]+\n?([ \t]*"//".*\n)*[ \t]*"{" {
115 : : /* RESOURCE // String TTT_XX ... */
116 : 0 : WorkOnTokenSet( RESOURCE, yytext );
117 : : }
118 : 0 :
119 : : ^[\t ]*[a-zA-Z_]+[\t ]*"\\"?[\t ]*\n?[ \t]*"{"[\t ]*"\\"? {
120 : : /* SMALRESOURCE // String ... */
121 : 0 : WorkOnTokenSet( SMALRESOURCE, yytext );
122 : : }
123 : 0 :
124 : : [\t ]*[a-zA-Z0-9_]+[ \t]*("["[ \t]*[a-zA-Z0-9_\-]+[ \t]*"]"[ \t]*)?=[ \t]*L?\".*\".*\n? {
125 : : /* TEXTLINE // TextTyp = "A Text" */
126 : 0 : WorkOnTokenSet( TEXTLINE, yytext );
127 : : }
128 : 0 :
129 : : [\t ]*[a-zA-Z0-9_]+[ \t]*("["[ \t]*[a-zA-Z0-9_\-]+[ \t]*"]"[ \t]*)?(\n[ \t]*)?=([ \t]*\n)?(([a-zA-Z0-9_]+)|(\".*\")|([ \t\n]*))*\".*\"(([a-zA-Z0-9_]+)|(\".*\")|([ \t\n]*))*; {
130 : : /* LONGTEXTLINE // TextTyp = "A Text" HHH_XXX "A Text" ZZZ_TTT ... */
131 : 0 : WorkOnTokenSet( LONGTEXTLINE, yytext );
132 : : }
133 : 0 :
134 : : \".*\" {
135 : 0 : /* TEXT // "A Text" */
136 : 0 : WorkOnTokenSet( TEXT, yytext );
137 : : }
138 : 0 :
139 : : "{"[ \t]*\\? {
140 : 0 : /* LEVELUP */
141 : 0 : WorkOnTokenSet( LEVELUP, yytext );
142 : : }
143 : 0 :
144 : : "}"[ \t]*;([ \t]*\\)? {
145 : 0 : /* LEVELDOWN */
146 : 0 : WorkOnTokenSet( LEVELDOWN, yytext );
147 : : }
148 : 0 :
149 : : [a-zA-Z0-9_]+[ \t]*"="[ \t]*"MAP_APPFONT"[ \t]*"(".+")".* {
150 : 0 : /* APPFONTMAPPING Typ = MAP_APPFONT( ... ) */
151 : 0 : WorkOnTokenSet( APPFONTMAPPING, yytext );
152 : : }
153 : 0 :
154 : : [ \t]*[a-zA-Z0-9_]+[ \t]*=[ \t]*[0123456789]{1,5}[ \t]*";"?\\? {
155 : 0 : /* TEXTREFID // TextTyp = 12345 */
156 : 0 : WorkOnTokenSet( TEXTREFID, yytext );
157 : : }
158 : 0 :
159 : : [a-zA-Z0-9_]+[ \t]*"="[\t ]*([ \t]*"//".*\n)*.* |
160 : : [a-zA-Z0-9_]+[ \t]*"=".* {
161 : : /* ASSIGNMENT Typ = ... */
162 : 0 : WorkOnTokenSet( ASSIGNMENT, yytext );
163 : : }
164 : 0 :
165 : :
166 : :
167 : 0 : [a-zA-Z0-9_]+[ \t]*("["[ \t]*[a-zA-Z0-9_\-]+[ \t]*"]"[ \t]*)?"="[ \t]*(\\[ \t]*)?\n?[ \t]*"{"[ \t]*(\\[ \t]*)?\n?[ \t]*"<" {
168 : : /* LISTASSIGNMENT Typ [ ... ] = ... */
169 : 0 : WorkOnTokenSet( LISTASSIGNMENT, yytext );
170 : : }
171 : 0 :
172 : : "StringList"+[ \t]*("["[ \t]*[a-zA-Z0-9_\-]+[ \t]*"]"[ \t]*)?"="[ \t]*(\\[ \t]*)?\n?[ \t]*"{"[ \t]*(\\[ \t]*)?\n?[ \t]* {
173 : : /* LISTASSIGNMENT Typ [ ... ] = ... */
174 : 0 : WorkOnTokenSet( LISTASSIGNMENT, yytext );
175 : : }
176 : 0 :
177 : : "UIEntries"[ \t]*("["[ \t]*[a-zA-Z0-9_\-]+[ \t]*"]"[ \t]*)?"="[ \t]*(\\[ \t]*)?\n?[ \t]*"{" {
178 : : /* UIENTRIES */
179 : 0 : WorkOnTokenSet( UIENTRIES, yytext );
180 : : }
181 : 0 :
182 : : "<"?[ \t]*L?\".*\".*">" {
183 : 0 : /* LISTTEXT */
184 : 0 : WorkOnTokenSet( LISTTEXT, yytext );
185 : : }
186 : 0 :
187 : : [ \t]*"#define"[ \t]+[a-zA-Z0-9_]+.*"\\" {
188 : 0 : /* RSCDEFINE #define ... */
189 : 0 : WorkOnTokenSet( RSCDEFINE, yytext );
190 : : }
191 : 0 :
192 : : [ \t]*"#define"[ \t]+[a-zA-Z0-9_]+.+ {
193 : 0 : /* #define ... */
194 : 0 : WorkOnTokenSet( NORMDEFINE, yytext );
195 : : }
196 : 0 :
197 : : "\\" {
198 : 0 : /* RSCDEFINELEND */
199 : 0 : WorkOnTokenSet( RSCDEFINELEND, yytext );
200 : : }
201 : 0 :
202 : : [a-zA-Z0-9_]+[ \t]*; {
203 : 0 : /* allowed other tokens like "49 ;" or "SFX_... ;" */
204 : 0 : WorkOnTokenSet( ANYTOKEN, yytext );
205 : : }
206 : 0 :
207 : : . {
208 : 0 : WorkOnTokenSet( UNKNOWNCHAR, yytext );
209 : : /* YYWarning( "Unknown Char" ); */
210 : : }
211 : 0 :
212 : : "{"?[ \t]*\".*\"[ \t]*";"[ \t]*"}" {
213 : 0 : /* _LISTTEXT */
214 : 0 : WorkOnTokenSet( _LISTTEXT, yytext );
215 : : }
216 : 0 :
217 : 0 : %%
218 : 0 :
219 : : /*****************************************************************************/
220 : : int yywrap(void)
221 : 0 : /*****************************************************************************/
222 : : {
223 : : return 1;
224 : 0 : }
225 : :
226 : : /*****************************************************************************/
227 : : void YYWarning( const char *s )
228 : 0 : /*****************************************************************************/
229 : : {
230 : : /* write warning to stderr */
231 : : fprintf( stderr, "Warning: \"%s\" in line %d: \"%s\"\n", s, yylineno, yytext );
232 : 0 : }
233 : 0 :
234 : : /*****************************************************************************/
235 : : void yyerror( const char *s )
236 : 0 : /*****************************************************************************/
237 : : {
238 : : /* write error to stderr */
239 : : fprintf( stderr, "Error: \"%s\" in line %d: \"%s\"\n", s, yylineno, yytext );
240 : 0 : SetError();
241 : 0 : }
242 : 0 :
243 : : SAL_IMPLEMENT_MAIN_WITH_ARGS(argc, argv) {
244 : 0 : int e;
245 : : yyin = init(argc, argv);
246 : 0 : yylex();
247 : 0 : e = GetError();
248 : 0 : Close();
249 : 0 : return EXIT_SUCCESS;
250 : 0 : }
|