1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski *
3*b1cdbd2cSJim Jagielski * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski * or more contributor license agreements. See the NOTICE file
5*b1cdbd2cSJim Jagielski * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski * regarding copyright ownership. The ASF licenses this file
7*b1cdbd2cSJim Jagielski * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski * with the License. You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski *
11*b1cdbd2cSJim Jagielski * http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski *
13*b1cdbd2cSJim Jagielski * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski * KIND, either express or implied. See the License for the
17*b1cdbd2cSJim Jagielski * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski * under the License.
19*b1cdbd2cSJim Jagielski *
20*b1cdbd2cSJim Jagielski *************************************************************/
21*b1cdbd2cSJim Jagielski
22*b1cdbd2cSJim Jagielski
23*b1cdbd2cSJim Jagielski
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_basic.hxx"
26*b1cdbd2cSJim Jagielski
27*b1cdbd2cSJim Jagielski #include <ctype.h>
28*b1cdbd2cSJim Jagielski #include "sbcomp.hxx"
29*b1cdbd2cSJim Jagielski
30*b1cdbd2cSJim Jagielski struct TokenTable { SbiToken t; const char *s; };
31*b1cdbd2cSJim Jagielski
32*b1cdbd2cSJim Jagielski static short nToken; // Anzahl der Tokens
33*b1cdbd2cSJim Jagielski
34*b1cdbd2cSJim Jagielski static TokenTable* pTokTable;
35*b1cdbd2cSJim Jagielski
36*b1cdbd2cSJim Jagielski static TokenTable aTokTable_Basic [] = { // Token-Tabelle:
37*b1cdbd2cSJim Jagielski
38*b1cdbd2cSJim Jagielski { CAT, "&" },
39*b1cdbd2cSJim Jagielski { MUL, "*" },
40*b1cdbd2cSJim Jagielski { PLUS, "+" },
41*b1cdbd2cSJim Jagielski { MINUS, "-" },
42*b1cdbd2cSJim Jagielski { DIV, "/" },
43*b1cdbd2cSJim Jagielski { EOS, ":" },
44*b1cdbd2cSJim Jagielski { ASSIGN, ":=" },
45*b1cdbd2cSJim Jagielski { LT, "<" },
46*b1cdbd2cSJim Jagielski { LE, "<=" },
47*b1cdbd2cSJim Jagielski { NE, "<>" },
48*b1cdbd2cSJim Jagielski { EQ, "=" },
49*b1cdbd2cSJim Jagielski { GT, ">" },
50*b1cdbd2cSJim Jagielski { GE, ">=" },
51*b1cdbd2cSJim Jagielski { ACCESS, "Access" },
52*b1cdbd2cSJim Jagielski { ALIAS, "Alias" },
53*b1cdbd2cSJim Jagielski { AND, "And" },
54*b1cdbd2cSJim Jagielski { ANY, "Any" },
55*b1cdbd2cSJim Jagielski { APPEND, "Append" },
56*b1cdbd2cSJim Jagielski { AS, "As" },
57*b1cdbd2cSJim Jagielski { BASE, "Base" },
58*b1cdbd2cSJim Jagielski { BINARY, "Binary" },
59*b1cdbd2cSJim Jagielski { TBOOLEAN, "Boolean" },
60*b1cdbd2cSJim Jagielski { BYREF, "ByRef", },
61*b1cdbd2cSJim Jagielski { TBYTE, "Byte", },
62*b1cdbd2cSJim Jagielski { BYVAL, "ByVal", },
63*b1cdbd2cSJim Jagielski { CALL, "Call" },
64*b1cdbd2cSJim Jagielski { CASE, "Case" },
65*b1cdbd2cSJim Jagielski { _CDECL_, "Cdecl" },
66*b1cdbd2cSJim Jagielski { CLASSMODULE, "ClassModule" },
67*b1cdbd2cSJim Jagielski { CLOSE, "Close" },
68*b1cdbd2cSJim Jagielski { COMPARE, "Compare" },
69*b1cdbd2cSJim Jagielski { COMPATIBLE,"Compatible" },
70*b1cdbd2cSJim Jagielski { _CONST_, "Const" },
71*b1cdbd2cSJim Jagielski { TCURRENCY,"Currency" },
72*b1cdbd2cSJim Jagielski { TDATE, "Date" },
73*b1cdbd2cSJim Jagielski { DECLARE, "Declare" },
74*b1cdbd2cSJim Jagielski { DEFBOOL, "DefBool" },
75*b1cdbd2cSJim Jagielski { DEFCUR, "DefCur" },
76*b1cdbd2cSJim Jagielski { DEFDATE, "DefDate" },
77*b1cdbd2cSJim Jagielski { DEFDBL, "DefDbl" },
78*b1cdbd2cSJim Jagielski { DEFERR, "DefErr" },
79*b1cdbd2cSJim Jagielski { DEFINT, "DefInt" },
80*b1cdbd2cSJim Jagielski { DEFLNG, "DefLng" },
81*b1cdbd2cSJim Jagielski { DEFOBJ, "DefObj" },
82*b1cdbd2cSJim Jagielski { DEFSNG, "DefSng" },
83*b1cdbd2cSJim Jagielski { DEFSTR, "DefStr" },
84*b1cdbd2cSJim Jagielski { DEFVAR, "DefVar" },
85*b1cdbd2cSJim Jagielski { DIM, "Dim" },
86*b1cdbd2cSJim Jagielski { DO, "Do" },
87*b1cdbd2cSJim Jagielski { TDOUBLE, "Double" },
88*b1cdbd2cSJim Jagielski { EACH, "Each" },
89*b1cdbd2cSJim Jagielski { ELSE, "Else" },
90*b1cdbd2cSJim Jagielski { ELSEIF, "ElseIf" },
91*b1cdbd2cSJim Jagielski { END, "End" },
92*b1cdbd2cSJim Jagielski { ENDENUM, "End Enum" },
93*b1cdbd2cSJim Jagielski { ENDFUNC, "End Function" },
94*b1cdbd2cSJim Jagielski { ENDIF, "End If" },
95*b1cdbd2cSJim Jagielski { ENDPROPERTY, "End Property" },
96*b1cdbd2cSJim Jagielski { ENDSELECT,"End Select" },
97*b1cdbd2cSJim Jagielski { ENDSUB, "End Sub" },
98*b1cdbd2cSJim Jagielski { ENDTYPE, "End Type" },
99*b1cdbd2cSJim Jagielski { ENDIF, "EndIf" },
100*b1cdbd2cSJim Jagielski { ENUM, "Enum" },
101*b1cdbd2cSJim Jagielski { EQV, "Eqv" },
102*b1cdbd2cSJim Jagielski { ERASE, "Erase" },
103*b1cdbd2cSJim Jagielski { _ERROR_, "Error" },
104*b1cdbd2cSJim Jagielski { EXIT, "Exit" },
105*b1cdbd2cSJim Jagielski { BASIC_EXPLICIT, "Explicit" },
106*b1cdbd2cSJim Jagielski { FOR, "For" },
107*b1cdbd2cSJim Jagielski { FUNCTION, "Function" },
108*b1cdbd2cSJim Jagielski { GET, "Get" },
109*b1cdbd2cSJim Jagielski { GLOBAL, "Global" },
110*b1cdbd2cSJim Jagielski { GOSUB, "GoSub" },
111*b1cdbd2cSJim Jagielski { GOTO, "GoTo" },
112*b1cdbd2cSJim Jagielski { IF, "If" },
113*b1cdbd2cSJim Jagielski { IMP, "Imp" },
114*b1cdbd2cSJim Jagielski { IMPLEMENTS, "Implements" },
115*b1cdbd2cSJim Jagielski { _IN_, "In" },
116*b1cdbd2cSJim Jagielski { INPUT, "Input" }, // auch INPUT #
117*b1cdbd2cSJim Jagielski { TINTEGER, "Integer" },
118*b1cdbd2cSJim Jagielski { IS, "Is" },
119*b1cdbd2cSJim Jagielski { LET, "Let" },
120*b1cdbd2cSJim Jagielski { LIB, "Lib" },
121*b1cdbd2cSJim Jagielski { LIKE, "Like" },
122*b1cdbd2cSJim Jagielski { LINE, "Line" },
123*b1cdbd2cSJim Jagielski { LINEINPUT,"Line Input" },
124*b1cdbd2cSJim Jagielski { LOCAL, "Local" },
125*b1cdbd2cSJim Jagielski { LOCK, "Lock" },
126*b1cdbd2cSJim Jagielski { TLONG, "Long" },
127*b1cdbd2cSJim Jagielski { LOOP, "Loop" },
128*b1cdbd2cSJim Jagielski { LPRINT, "LPrint" },
129*b1cdbd2cSJim Jagielski { LSET, "LSet" }, // JSM
130*b1cdbd2cSJim Jagielski { MOD, "Mod" },
131*b1cdbd2cSJim Jagielski { NAME, "Name" },
132*b1cdbd2cSJim Jagielski { NEW, "New" },
133*b1cdbd2cSJim Jagielski { NEXT, "Next" },
134*b1cdbd2cSJim Jagielski { NOT, "Not" },
135*b1cdbd2cSJim Jagielski { TOBJECT, "Object" },
136*b1cdbd2cSJim Jagielski { ON, "On" },
137*b1cdbd2cSJim Jagielski { OPEN, "Open" },
138*b1cdbd2cSJim Jagielski { OPTION, "Option" },
139*b1cdbd2cSJim Jagielski { _OPTIONAL_, "Optional" },
140*b1cdbd2cSJim Jagielski { OR, "Or" },
141*b1cdbd2cSJim Jagielski { OUTPUT, "Output" },
142*b1cdbd2cSJim Jagielski { PARAMARRAY, "ParamArray" },
143*b1cdbd2cSJim Jagielski { PRESERVE, "Preserve" },
144*b1cdbd2cSJim Jagielski { PRINT, "Print" },
145*b1cdbd2cSJim Jagielski { PRIVATE, "Private" },
146*b1cdbd2cSJim Jagielski { PROPERTY, "Property" },
147*b1cdbd2cSJim Jagielski { PUBLIC, "Public" },
148*b1cdbd2cSJim Jagielski { RANDOM, "Random" },
149*b1cdbd2cSJim Jagielski { READ, "Read" },
150*b1cdbd2cSJim Jagielski { REDIM, "ReDim" },
151*b1cdbd2cSJim Jagielski { REM, "Rem" },
152*b1cdbd2cSJim Jagielski { RESUME, "Resume" },
153*b1cdbd2cSJim Jagielski { RETURN, "Return" },
154*b1cdbd2cSJim Jagielski { RSET, "RSet" }, // JSM
155*b1cdbd2cSJim Jagielski { SELECT, "Select" },
156*b1cdbd2cSJim Jagielski { SET, "Set" },
157*b1cdbd2cSJim Jagielski #ifdef SHARED
158*b1cdbd2cSJim Jagielski #undef SHARED
159*b1cdbd2cSJim Jagielski #define tmpSHARED
160*b1cdbd2cSJim Jagielski #endif
161*b1cdbd2cSJim Jagielski { SHARED, "Shared" },
162*b1cdbd2cSJim Jagielski #ifdef tmpSHARED
163*b1cdbd2cSJim Jagielski #define SHARED
164*b1cdbd2cSJim Jagielski #undef tmpSHARED
165*b1cdbd2cSJim Jagielski #endif
166*b1cdbd2cSJim Jagielski { TSINGLE, "Single" },
167*b1cdbd2cSJim Jagielski { STATIC, "Static" },
168*b1cdbd2cSJim Jagielski { STEP, "Step" },
169*b1cdbd2cSJim Jagielski { STOP, "Stop" },
170*b1cdbd2cSJim Jagielski { TSTRING, "String" },
171*b1cdbd2cSJim Jagielski { SUB, "Sub" },
172*b1cdbd2cSJim Jagielski { STOP, "System" },
173*b1cdbd2cSJim Jagielski { TEXT, "Text" },
174*b1cdbd2cSJim Jagielski { THEN, "Then" },
175*b1cdbd2cSJim Jagielski { TO, "To", },
176*b1cdbd2cSJim Jagielski { TYPE, "Type" },
177*b1cdbd2cSJim Jagielski { TYPEOF, "TypeOf" },
178*b1cdbd2cSJim Jagielski { UNTIL, "Until" },
179*b1cdbd2cSJim Jagielski { TVARIANT, "Variant" },
180*b1cdbd2cSJim Jagielski { VBASUPPORT, "VbaSupport" },
181*b1cdbd2cSJim Jagielski { WEND, "Wend" },
182*b1cdbd2cSJim Jagielski { WHILE, "While" },
183*b1cdbd2cSJim Jagielski { WITH, "With" },
184*b1cdbd2cSJim Jagielski { WITHEVENTS, "WithEvents" },
185*b1cdbd2cSJim Jagielski { WRITE, "Write" }, // auch WRITE #
186*b1cdbd2cSJim Jagielski { XOR, "Xor" },
187*b1cdbd2cSJim Jagielski { NIL, "" }
188*b1cdbd2cSJim Jagielski };
189*b1cdbd2cSJim Jagielski
190*b1cdbd2cSJim Jagielski /*
191*b1cdbd2cSJim Jagielski TokenTable aTokTable_Java [] = { // Token-Tabelle:
192*b1cdbd2cSJim Jagielski
193*b1cdbd2cSJim Jagielski { JS_LOG_NOT, "!" },
194*b1cdbd2cSJim Jagielski { JS_NE, "!=" },
195*b1cdbd2cSJim Jagielski { JS_MOD, "%" },
196*b1cdbd2cSJim Jagielski { JS_ASS_MOD, "%=" },
197*b1cdbd2cSJim Jagielski { JS_BIT_AND, "&" },
198*b1cdbd2cSJim Jagielski { JS_LOG_AND, "&&" },
199*b1cdbd2cSJim Jagielski { JS_ASS_AND, "&=" },
200*b1cdbd2cSJim Jagielski { JS_LPAREN, "(" },
201*b1cdbd2cSJim Jagielski { JS_RPAREN, ")" },
202*b1cdbd2cSJim Jagielski { JS_MUL, "*" },
203*b1cdbd2cSJim Jagielski { JS_ASS_MUL, "*=" },
204*b1cdbd2cSJim Jagielski { JS_PLUS, "+" },
205*b1cdbd2cSJim Jagielski { JS_INC, "++" },
206*b1cdbd2cSJim Jagielski { JS_ASS_PLUS, "+=" },
207*b1cdbd2cSJim Jagielski { JS_COMMA, "," },
208*b1cdbd2cSJim Jagielski { JS_MINUS, "-" },
209*b1cdbd2cSJim Jagielski { JS_DEC, "--" },
210*b1cdbd2cSJim Jagielski { JS_ASS_MINUS, "-=" },
211*b1cdbd2cSJim Jagielski { JS_DIV, "/" },
212*b1cdbd2cSJim Jagielski { JS_ASS_DIV, "/=" },
213*b1cdbd2cSJim Jagielski { JS_COND_SEL, ":" },
214*b1cdbd2cSJim Jagielski { JS_LT, "<" },
215*b1cdbd2cSJim Jagielski { JS_LSHIFT, "<<" },
216*b1cdbd2cSJim Jagielski { JS_ASS_LSHIFT,"<<=" },
217*b1cdbd2cSJim Jagielski { JS_LE, "<=" },
218*b1cdbd2cSJim Jagielski { JS_NE, "<>" },
219*b1cdbd2cSJim Jagielski { JS_ASSIGNMENT,"=" },
220*b1cdbd2cSJim Jagielski { JS_EQ, "==" },
221*b1cdbd2cSJim Jagielski { JS_GT, ">" },
222*b1cdbd2cSJim Jagielski { JS_RSHIFT, ">>" },
223*b1cdbd2cSJim Jagielski { JS_ASS_RSHIFT,">>=" },
224*b1cdbd2cSJim Jagielski { JS_RSHIFT_Z, ">>>" },
225*b1cdbd2cSJim Jagielski { JS_ASS_RSHIFT_Z,">>>=" },
226*b1cdbd2cSJim Jagielski { JS_GE, ">=" },
227*b1cdbd2cSJim Jagielski { JS_COND_QUEST,"?" },
228*b1cdbd2cSJim Jagielski { ACCESS, "Access" },
229*b1cdbd2cSJim Jagielski { ALIAS, "Alias" },
230*b1cdbd2cSJim Jagielski { AND, "And" },
231*b1cdbd2cSJim Jagielski { ANY, "Any" },
232*b1cdbd2cSJim Jagielski { APPEND, "Append" },
233*b1cdbd2cSJim Jagielski { AS, "As" },
234*b1cdbd2cSJim Jagielski { BASE, "Base" },
235*b1cdbd2cSJim Jagielski { BINARY, "Binary" },
236*b1cdbd2cSJim Jagielski { TBOOLEAN, "Boolean" },
237*b1cdbd2cSJim Jagielski { BYVAL, "ByVal", },
238*b1cdbd2cSJim Jagielski { CALL, "Call" },
239*b1cdbd2cSJim Jagielski { CASE, "Case" },
240*b1cdbd2cSJim Jagielski { _CDECL_, "Cdecl" },
241*b1cdbd2cSJim Jagielski { CLOSE, "Close" },
242*b1cdbd2cSJim Jagielski { COMPARE, "Compare" },
243*b1cdbd2cSJim Jagielski { _CONST_, "Const" },
244*b1cdbd2cSJim Jagielski { TCURRENCY,"Currency" },
245*b1cdbd2cSJim Jagielski { TDATE, "Date" },
246*b1cdbd2cSJim Jagielski { DECLARE, "Declare" },
247*b1cdbd2cSJim Jagielski { DEFBOOL, "DefBool" },
248*b1cdbd2cSJim Jagielski { DEFCUR, "DefCur" },
249*b1cdbd2cSJim Jagielski { DEFDATE, "DefDate" },
250*b1cdbd2cSJim Jagielski { DEFDBL, "DefDbl" },
251*b1cdbd2cSJim Jagielski { DEFERR, "DefErr" },
252*b1cdbd2cSJim Jagielski { DEFINT, "DefInt" },
253*b1cdbd2cSJim Jagielski { DEFLNG, "DefLng" },
254*b1cdbd2cSJim Jagielski { DEFOBJ, "DefObj" },
255*b1cdbd2cSJim Jagielski { DEFSNG, "DefSng" },
256*b1cdbd2cSJim Jagielski { DEFSTR, "DefStr" },
257*b1cdbd2cSJim Jagielski { DEFVAR, "DefVar" },
258*b1cdbd2cSJim Jagielski { DIM, "Dim" },
259*b1cdbd2cSJim Jagielski { DO, "Do" },
260*b1cdbd2cSJim Jagielski { TDOUBLE, "Double" },
261*b1cdbd2cSJim Jagielski { EACH, "Each" },
262*b1cdbd2cSJim Jagielski { ELSE, "Else" },
263*b1cdbd2cSJim Jagielski { ELSEIF, "ElseIf" },
264*b1cdbd2cSJim Jagielski { END, "End" },
265*b1cdbd2cSJim Jagielski { ENDFUNC, "End Function" },
266*b1cdbd2cSJim Jagielski { ENDIF, "End If" },
267*b1cdbd2cSJim Jagielski { ENDSELECT,"End Select" },
268*b1cdbd2cSJim Jagielski { ENDSUB, "End Sub" },
269*b1cdbd2cSJim Jagielski { ENDTYPE, "End Type" },
270*b1cdbd2cSJim Jagielski { ENDIF, "EndIf" },
271*b1cdbd2cSJim Jagielski { EQV, "Eqv" },
272*b1cdbd2cSJim Jagielski { ERASE, "Erase" },
273*b1cdbd2cSJim Jagielski { _ERROR_, "Error" },
274*b1cdbd2cSJim Jagielski { EXIT, "Exit" },
275*b1cdbd2cSJim Jagielski { BASIC_EXPLICIT, "Explicit" },
276*b1cdbd2cSJim Jagielski { FOR, "For" },
277*b1cdbd2cSJim Jagielski { FUNCTION, "Function" },
278*b1cdbd2cSJim Jagielski { GLOBAL, "Global" },
279*b1cdbd2cSJim Jagielski { GOSUB, "GoSub" },
280*b1cdbd2cSJim Jagielski { GOTO, "GoTo" },
281*b1cdbd2cSJim Jagielski { IF, "If" },
282*b1cdbd2cSJim Jagielski { IMP, "Imp" },
283*b1cdbd2cSJim Jagielski { _IN_, "In" },
284*b1cdbd2cSJim Jagielski { INPUT, "Input" }, // auch INPUT #
285*b1cdbd2cSJim Jagielski { TINTEGER, "Integer" },
286*b1cdbd2cSJim Jagielski { IS, "Is" },
287*b1cdbd2cSJim Jagielski { LET, "Let" },
288*b1cdbd2cSJim Jagielski { LIB, "Lib" },
289*b1cdbd2cSJim Jagielski { LINE, "Line" },
290*b1cdbd2cSJim Jagielski { LINEINPUT,"Line Input" },
291*b1cdbd2cSJim Jagielski { LOCAL, "Local" },
292*b1cdbd2cSJim Jagielski { LOCK, "Lock" },
293*b1cdbd2cSJim Jagielski { TLONG, "Long" },
294*b1cdbd2cSJim Jagielski { LOOP, "Loop" },
295*b1cdbd2cSJim Jagielski { LPRINT, "LPrint" },
296*b1cdbd2cSJim Jagielski { LSET, "LSet" }, // JSM
297*b1cdbd2cSJim Jagielski { MOD, "Mod" },
298*b1cdbd2cSJim Jagielski { NAME, "Name" },
299*b1cdbd2cSJim Jagielski { NEW, "New" },
300*b1cdbd2cSJim Jagielski { NEXT, "Next" },
301*b1cdbd2cSJim Jagielski { NOT, "Not" },
302*b1cdbd2cSJim Jagielski { TOBJECT, "Object" },
303*b1cdbd2cSJim Jagielski { ON, "On" },
304*b1cdbd2cSJim Jagielski { OPEN, "Open" },
305*b1cdbd2cSJim Jagielski { OPTION, "Option" },
306*b1cdbd2cSJim Jagielski { _OPTIONAL_, "Optional" },
307*b1cdbd2cSJim Jagielski { OR, "Or" },
308*b1cdbd2cSJim Jagielski { OUTPUT, "Output" },
309*b1cdbd2cSJim Jagielski { PRESERVE, "Preserve" },
310*b1cdbd2cSJim Jagielski { PRINT, "Print" },
311*b1cdbd2cSJim Jagielski { PRIVATE, "Private" },
312*b1cdbd2cSJim Jagielski { PUBLIC, "Public" },
313*b1cdbd2cSJim Jagielski { RANDOM, "Random" },
314*b1cdbd2cSJim Jagielski { READ, "Read" },
315*b1cdbd2cSJim Jagielski { REDIM, "ReDim" },
316*b1cdbd2cSJim Jagielski { REM, "Rem" },
317*b1cdbd2cSJim Jagielski { RESUME, "Resume" },
318*b1cdbd2cSJim Jagielski { RETURN, "Return" },
319*b1cdbd2cSJim Jagielski { RSET, "RSet" }, // JSM
320*b1cdbd2cSJim Jagielski { SELECT, "Select" },
321*b1cdbd2cSJim Jagielski { SET, "Set" },
322*b1cdbd2cSJim Jagielski { SHARED, "Shared" },
323*b1cdbd2cSJim Jagielski { TSINGLE, "Single" },
324*b1cdbd2cSJim Jagielski { STATIC, "Static" },
325*b1cdbd2cSJim Jagielski { STEP, "Step" },
326*b1cdbd2cSJim Jagielski { STOP, "Stop" },
327*b1cdbd2cSJim Jagielski { TSTRING, "String" },
328*b1cdbd2cSJim Jagielski { SUB, "Sub" },
329*b1cdbd2cSJim Jagielski { STOP, "System" },
330*b1cdbd2cSJim Jagielski { TEXT, "Text" },
331*b1cdbd2cSJim Jagielski { THEN, "Then" },
332*b1cdbd2cSJim Jagielski { TO, "To", },
333*b1cdbd2cSJim Jagielski { TYPE, "Type" },
334*b1cdbd2cSJim Jagielski { UNTIL, "Until" },
335*b1cdbd2cSJim Jagielski { TVARIANT, "Variant" },
336*b1cdbd2cSJim Jagielski { WEND, "Wend" },
337*b1cdbd2cSJim Jagielski { WHILE, "While" },
338*b1cdbd2cSJim Jagielski { WITH, "With" },
339*b1cdbd2cSJim Jagielski { WRITE, "Write" }, // auch WRITE #
340*b1cdbd2cSJim Jagielski { XOR, "Xor" },
341*b1cdbd2cSJim Jagielski { JS_LINDEX, "[" },
342*b1cdbd2cSJim Jagielski { JS_RINDEX, "]" },
343*b1cdbd2cSJim Jagielski { JS_BIT_XOR, "^" },
344*b1cdbd2cSJim Jagielski { JS_ASS_XOR, "^=" },
345*b1cdbd2cSJim Jagielski { JS_BIT_OR, "|" },
346*b1cdbd2cSJim Jagielski { JS_ASS_OR, "|=" },
347*b1cdbd2cSJim Jagielski { JS_LOG_OR, "||" },
348*b1cdbd2cSJim Jagielski { JS_BIT_NOT, "~" },
349*b1cdbd2cSJim Jagielski { NIL }
350*b1cdbd2cSJim Jagielski };
351*b1cdbd2cSJim Jagielski */
352*b1cdbd2cSJim Jagielski
353*b1cdbd2cSJim Jagielski // #i109076
TokenLabelInfo(void)354*b1cdbd2cSJim Jagielski TokenLabelInfo::TokenLabelInfo( void )
355*b1cdbd2cSJim Jagielski {
356*b1cdbd2cSJim Jagielski m_pTokenCanBeLabelTab = new bool[VBASUPPORT+1];
357*b1cdbd2cSJim Jagielski for( int i = 0 ; i <= VBASUPPORT ; ++i )
358*b1cdbd2cSJim Jagielski m_pTokenCanBeLabelTab[i] = false;
359*b1cdbd2cSJim Jagielski
360*b1cdbd2cSJim Jagielski // Token accepted as label by VBA
361*b1cdbd2cSJim Jagielski SbiToken eLabelToken[] = { ACCESS, ALIAS, APPEND, BASE, BINARY, CLASSMODULE,
362*b1cdbd2cSJim Jagielski COMPARE, COMPATIBLE, DEFERR, _ERROR_, BASIC_EXPLICIT, LIB, LINE, LPRINT, NAME,
363*b1cdbd2cSJim Jagielski TOBJECT, OUTPUT, PROPERTY, RANDOM, READ, STEP, STOP, TEXT, VBASUPPORT, NIL };
364*b1cdbd2cSJim Jagielski SbiToken* pTok = eLabelToken;
365*b1cdbd2cSJim Jagielski SbiToken eTok;
366*b1cdbd2cSJim Jagielski for( pTok = eLabelToken ; (eTok = *pTok) != NIL ; ++pTok )
367*b1cdbd2cSJim Jagielski m_pTokenCanBeLabelTab[eTok] = true;
368*b1cdbd2cSJim Jagielski }
369*b1cdbd2cSJim Jagielski
~TokenLabelInfo()370*b1cdbd2cSJim Jagielski TokenLabelInfo::~TokenLabelInfo()
371*b1cdbd2cSJim Jagielski {
372*b1cdbd2cSJim Jagielski delete[] m_pTokenCanBeLabelTab;
373*b1cdbd2cSJim Jagielski }
374*b1cdbd2cSJim Jagielski
375*b1cdbd2cSJim Jagielski
376*b1cdbd2cSJim Jagielski // Der Konstruktor ermittelt die Laenge der Token-Tabelle.
377*b1cdbd2cSJim Jagielski
SbiTokenizer(const::rtl::OUString & rSrc,StarBASIC * pb)378*b1cdbd2cSJim Jagielski SbiTokenizer::SbiTokenizer( const ::rtl::OUString& rSrc, StarBASIC* pb )
379*b1cdbd2cSJim Jagielski : SbiScanner( rSrc, pb )
380*b1cdbd2cSJim Jagielski {
381*b1cdbd2cSJim Jagielski pTokTable = aTokTable_Basic;
382*b1cdbd2cSJim Jagielski //if( StarBASIC::GetGlobalLanguageMode() == SB_LANG_JAVASCRIPT )
383*b1cdbd2cSJim Jagielski // pTokTable = aTokTable_Java;
384*b1cdbd2cSJim Jagielski TokenTable *tp;
385*b1cdbd2cSJim Jagielski bEof = bAs = sal_False;
386*b1cdbd2cSJim Jagielski eCurTok = NIL;
387*b1cdbd2cSJim Jagielski ePush = NIL;
388*b1cdbd2cSJim Jagielski bEos = bKeywords = bErrorIsSymbol = sal_True;
389*b1cdbd2cSJim Jagielski if( !nToken )
390*b1cdbd2cSJim Jagielski for( nToken = 0, tp = pTokTable; tp->t; nToken++, tp++ ) {}
391*b1cdbd2cSJim Jagielski }
392*b1cdbd2cSJim Jagielski
~SbiTokenizer()393*b1cdbd2cSJim Jagielski SbiTokenizer::~SbiTokenizer()
394*b1cdbd2cSJim Jagielski {
395*b1cdbd2cSJim Jagielski }
396*b1cdbd2cSJim Jagielski
397*b1cdbd2cSJim Jagielski // Wiederablage (Pushback) eines Tokens. (Bis zu 2 Tokens)
398*b1cdbd2cSJim Jagielski
Push(SbiToken t)399*b1cdbd2cSJim Jagielski void SbiTokenizer::Push( SbiToken t )
400*b1cdbd2cSJim Jagielski {
401*b1cdbd2cSJim Jagielski if( ePush != NIL )
402*b1cdbd2cSJim Jagielski Error( SbERR_INTERNAL_ERROR, "PUSH" );
403*b1cdbd2cSJim Jagielski else ePush = t;
404*b1cdbd2cSJim Jagielski }
405*b1cdbd2cSJim Jagielski
Error(SbError code,const char * pMsg)406*b1cdbd2cSJim Jagielski void SbiTokenizer::Error( SbError code, const char* pMsg )
407*b1cdbd2cSJim Jagielski {
408*b1cdbd2cSJim Jagielski aError = String::CreateFromAscii( pMsg );
409*b1cdbd2cSJim Jagielski Error( code );
410*b1cdbd2cSJim Jagielski }
411*b1cdbd2cSJim Jagielski
Error(SbError code,String aMsg)412*b1cdbd2cSJim Jagielski void SbiTokenizer::Error( SbError code, String aMsg )
413*b1cdbd2cSJim Jagielski {
414*b1cdbd2cSJim Jagielski aError = aMsg;
415*b1cdbd2cSJim Jagielski Error( code );
416*b1cdbd2cSJim Jagielski }
417*b1cdbd2cSJim Jagielski
Error(SbError code,SbiToken tok)418*b1cdbd2cSJim Jagielski void SbiTokenizer::Error( SbError code, SbiToken tok )
419*b1cdbd2cSJim Jagielski {
420*b1cdbd2cSJim Jagielski aError = Symbol( tok );
421*b1cdbd2cSJim Jagielski Error( code );
422*b1cdbd2cSJim Jagielski }
423*b1cdbd2cSJim Jagielski
424*b1cdbd2cSJim Jagielski // Einlesen des naechsten Tokens, ohne dass das Token geschluckt wird
425*b1cdbd2cSJim Jagielski
Peek()426*b1cdbd2cSJim Jagielski SbiToken SbiTokenizer::Peek()
427*b1cdbd2cSJim Jagielski {
428*b1cdbd2cSJim Jagielski if( ePush == NIL )
429*b1cdbd2cSJim Jagielski {
430*b1cdbd2cSJim Jagielski sal_uInt16 nOldLine = nLine;
431*b1cdbd2cSJim Jagielski sal_uInt16 nOldCol1 = nCol1;
432*b1cdbd2cSJim Jagielski sal_uInt16 nOldCol2 = nCol2;
433*b1cdbd2cSJim Jagielski ePush = Next();
434*b1cdbd2cSJim Jagielski nPLine = nLine; nLine = nOldLine;
435*b1cdbd2cSJim Jagielski nPCol1 = nCol1; nCol1 = nOldCol1;
436*b1cdbd2cSJim Jagielski nPCol2 = nCol2; nCol2 = nOldCol2;
437*b1cdbd2cSJim Jagielski }
438*b1cdbd2cSJim Jagielski return eCurTok = ePush;
439*b1cdbd2cSJim Jagielski }
440*b1cdbd2cSJim Jagielski
441*b1cdbd2cSJim Jagielski // Dies ist fuer die Decompilation.
442*b1cdbd2cSJim Jagielski // Zahlen und Symbole liefern einen Leerstring zurueck.
443*b1cdbd2cSJim Jagielski
Symbol(SbiToken t)444*b1cdbd2cSJim Jagielski const String& SbiTokenizer::Symbol( SbiToken t )
445*b1cdbd2cSJim Jagielski {
446*b1cdbd2cSJim Jagielski // Zeichen-Token?
447*b1cdbd2cSJim Jagielski if( t < FIRSTKWD )
448*b1cdbd2cSJim Jagielski {
449*b1cdbd2cSJim Jagielski aSym = (char) t;
450*b1cdbd2cSJim Jagielski return aSym;
451*b1cdbd2cSJim Jagielski }
452*b1cdbd2cSJim Jagielski switch( t )
453*b1cdbd2cSJim Jagielski {
454*b1cdbd2cSJim Jagielski case NEG : aSym = '-'; return aSym;
455*b1cdbd2cSJim Jagielski case EOS : aSym = String::CreateFromAscii( ":/CRLF" ); return aSym;
456*b1cdbd2cSJim Jagielski case EOLN : aSym = String::CreateFromAscii( "CRLF" ); return aSym;
457*b1cdbd2cSJim Jagielski default: break;
458*b1cdbd2cSJim Jagielski }
459*b1cdbd2cSJim Jagielski TokenTable* tp = pTokTable;
460*b1cdbd2cSJim Jagielski for( short i = 0; i < nToken; i++, tp++ )
461*b1cdbd2cSJim Jagielski {
462*b1cdbd2cSJim Jagielski if( tp->t == t )
463*b1cdbd2cSJim Jagielski {
464*b1cdbd2cSJim Jagielski aSym = String::CreateFromAscii( tp->s );
465*b1cdbd2cSJim Jagielski return aSym;
466*b1cdbd2cSJim Jagielski }
467*b1cdbd2cSJim Jagielski }
468*b1cdbd2cSJim Jagielski const sal_Unicode *p = aSym.GetBuffer();
469*b1cdbd2cSJim Jagielski if (*p <= ' ') aSym = String::CreateFromAscii( "???" );
470*b1cdbd2cSJim Jagielski return aSym;
471*b1cdbd2cSJim Jagielski }
472*b1cdbd2cSJim Jagielski
473*b1cdbd2cSJim Jagielski // Einlesen des naechsten Tokens und Ablage desselben
474*b1cdbd2cSJim Jagielski // Tokens, die nicht in der Token-Tabelle vorkommen, werden
475*b1cdbd2cSJim Jagielski // direkt als Zeichen zurueckgeliefert.
476*b1cdbd2cSJim Jagielski // Einige Worte werden gesondert behandelt.
477*b1cdbd2cSJim Jagielski
Next()478*b1cdbd2cSJim Jagielski SbiToken SbiTokenizer::Next()
479*b1cdbd2cSJim Jagielski {
480*b1cdbd2cSJim Jagielski if (bEof) return EOLN;
481*b1cdbd2cSJim Jagielski // Schon eines eingelesen?
482*b1cdbd2cSJim Jagielski if( ePush != NIL )
483*b1cdbd2cSJim Jagielski {
484*b1cdbd2cSJim Jagielski eCurTok = ePush;
485*b1cdbd2cSJim Jagielski ePush = NIL;
486*b1cdbd2cSJim Jagielski nLine = nPLine;
487*b1cdbd2cSJim Jagielski nCol1 = nPCol1;
488*b1cdbd2cSJim Jagielski nCol2 = nPCol2;
489*b1cdbd2cSJim Jagielski bEos = IsEoln( eCurTok );
490*b1cdbd2cSJim Jagielski return eCurTok;
491*b1cdbd2cSJim Jagielski }
492*b1cdbd2cSJim Jagielski TokenTable *tp;
493*b1cdbd2cSJim Jagielski
494*b1cdbd2cSJim Jagielski // Sonst einlesen:
495*b1cdbd2cSJim Jagielski if( !NextSym() )
496*b1cdbd2cSJim Jagielski {
497*b1cdbd2cSJim Jagielski bEof = bEos = sal_True;
498*b1cdbd2cSJim Jagielski return eCurTok = EOLN;
499*b1cdbd2cSJim Jagielski }
500*b1cdbd2cSJim Jagielski // Zeilenende?
501*b1cdbd2cSJim Jagielski if( aSym.GetBuffer()[0] == '\n' )
502*b1cdbd2cSJim Jagielski {
503*b1cdbd2cSJim Jagielski bEos = sal_True; return eCurTok = EOLN;
504*b1cdbd2cSJim Jagielski }
505*b1cdbd2cSJim Jagielski bEos = sal_False;
506*b1cdbd2cSJim Jagielski
507*b1cdbd2cSJim Jagielski // Zahl?
508*b1cdbd2cSJim Jagielski if( bNumber )
509*b1cdbd2cSJim Jagielski return eCurTok = NUMBER;
510*b1cdbd2cSJim Jagielski
511*b1cdbd2cSJim Jagielski // String?
512*b1cdbd2cSJim Jagielski else if( ( eScanType == SbxDATE || eScanType == SbxSTRING ) && !bSymbol )
513*b1cdbd2cSJim Jagielski return eCurTok = FIXSTRING;
514*b1cdbd2cSJim Jagielski // Sonderfaelle von Zeichen, die zwischen "Z" und "a" liegen. ICompare()
515*b1cdbd2cSJim Jagielski // wertet die Position dieser Zeichen unterschiedlich aus.
516*b1cdbd2cSJim Jagielski else if( aSym.GetBuffer()[0] == '^' )
517*b1cdbd2cSJim Jagielski return eCurTok = EXPON;
518*b1cdbd2cSJim Jagielski else if( aSym.GetBuffer()[0] == '\\' )
519*b1cdbd2cSJim Jagielski return eCurTok = IDIV;
520*b1cdbd2cSJim Jagielski else
521*b1cdbd2cSJim Jagielski {
522*b1cdbd2cSJim Jagielski // Mit Typkennung oder ein Symbol und keine Keyword-Erkennung?
523*b1cdbd2cSJim Jagielski // Dann kein Token-Test
524*b1cdbd2cSJim Jagielski if( eScanType != SbxVARIANT
525*b1cdbd2cSJim Jagielski || ( !bKeywords && bSymbol ) )
526*b1cdbd2cSJim Jagielski return eCurTok = SYMBOL;
527*b1cdbd2cSJim Jagielski // Gueltiges Token?
528*b1cdbd2cSJim Jagielski short lb = 0;
529*b1cdbd2cSJim Jagielski short ub = nToken-1;
530*b1cdbd2cSJim Jagielski short delta;
531*b1cdbd2cSJim Jagielski do
532*b1cdbd2cSJim Jagielski {
533*b1cdbd2cSJim Jagielski delta = (ub - lb) >> 1;
534*b1cdbd2cSJim Jagielski tp = &pTokTable[ lb + delta ];
535*b1cdbd2cSJim Jagielski StringCompare res = aSym.CompareIgnoreCaseToAscii( tp->s );
536*b1cdbd2cSJim Jagielski // Gefunden?
537*b1cdbd2cSJim Jagielski if( res == COMPARE_EQUAL )
538*b1cdbd2cSJim Jagielski goto special;
539*b1cdbd2cSJim Jagielski // Groesser? Dann untere Haelfte
540*b1cdbd2cSJim Jagielski if( res == COMPARE_LESS )
541*b1cdbd2cSJim Jagielski {
542*b1cdbd2cSJim Jagielski if ((ub - lb) == 2) ub = lb;
543*b1cdbd2cSJim Jagielski else ub = ub - delta;
544*b1cdbd2cSJim Jagielski }
545*b1cdbd2cSJim Jagielski // Kleiner? Dann obere Haelfte
546*b1cdbd2cSJim Jagielski else
547*b1cdbd2cSJim Jagielski {
548*b1cdbd2cSJim Jagielski if ((ub -lb) == 2) lb = ub;
549*b1cdbd2cSJim Jagielski else lb = lb + delta;
550*b1cdbd2cSJim Jagielski }
551*b1cdbd2cSJim Jagielski } while( delta );
552*b1cdbd2cSJim Jagielski // Symbol? Wenn nicht >= Token
553*b1cdbd2cSJim Jagielski sal_Unicode ch = aSym.GetBuffer()[0];
554*b1cdbd2cSJim Jagielski if( !BasicSimpleCharClass::isAlpha( ch, bCompatible ) && !bSymbol )
555*b1cdbd2cSJim Jagielski return eCurTok = (SbiToken) (ch & 0x00FF);
556*b1cdbd2cSJim Jagielski return eCurTok = SYMBOL;
557*b1cdbd2cSJim Jagielski }
558*b1cdbd2cSJim Jagielski special:
559*b1cdbd2cSJim Jagielski // #i92642
560*b1cdbd2cSJim Jagielski bool bStartOfLine = (eCurTok == NIL || eCurTok == REM || eCurTok == EOLN);
561*b1cdbd2cSJim Jagielski if( !bStartOfLine && (tp->t == NAME || tp->t == LINE) )
562*b1cdbd2cSJim Jagielski return eCurTok = SYMBOL;
563*b1cdbd2cSJim Jagielski else if( tp->t == TEXT )
564*b1cdbd2cSJim Jagielski return eCurTok = SYMBOL;
565*b1cdbd2cSJim Jagielski
566*b1cdbd2cSJim Jagielski // #i92642: Special LINE token handling -> SbiParser::Line()
567*b1cdbd2cSJim Jagielski
568*b1cdbd2cSJim Jagielski // END IF, CASE, SUB, DEF, FUNCTION, TYPE, CLASS, WITH
569*b1cdbd2cSJim Jagielski if( tp->t == END )
570*b1cdbd2cSJim Jagielski {
571*b1cdbd2cSJim Jagielski // AB, 15.3.96, Spezialbehandlung fuer END, beim Peek() geht die
572*b1cdbd2cSJim Jagielski // aktuelle Zeile verloren, daher alles merken und danach restaurieren
573*b1cdbd2cSJim Jagielski sal_uInt16 nOldLine = nLine;
574*b1cdbd2cSJim Jagielski sal_uInt16 nOldCol = nCol;
575*b1cdbd2cSJim Jagielski sal_uInt16 nOldCol1 = nCol1;
576*b1cdbd2cSJim Jagielski sal_uInt16 nOldCol2 = nCol2;
577*b1cdbd2cSJim Jagielski String aOldSym = aSym;
578*b1cdbd2cSJim Jagielski SaveLine(); // pLine im Scanner sichern
579*b1cdbd2cSJim Jagielski
580*b1cdbd2cSJim Jagielski eCurTok = Peek();
581*b1cdbd2cSJim Jagielski switch( eCurTok )
582*b1cdbd2cSJim Jagielski {
583*b1cdbd2cSJim Jagielski case IF: Next(); eCurTok = ENDIF; break;
584*b1cdbd2cSJim Jagielski case SELECT: Next(); eCurTok = ENDSELECT; break;
585*b1cdbd2cSJim Jagielski case SUB: Next(); eCurTok = ENDSUB; break;
586*b1cdbd2cSJim Jagielski case FUNCTION: Next(); eCurTok = ENDFUNC; break;
587*b1cdbd2cSJim Jagielski case PROPERTY: Next(); eCurTok = ENDPROPERTY; break;
588*b1cdbd2cSJim Jagielski case TYPE: Next(); eCurTok = ENDTYPE; break;
589*b1cdbd2cSJim Jagielski case ENUM: Next(); eCurTok = ENDENUM; break;
590*b1cdbd2cSJim Jagielski case WITH: Next(); eCurTok = ENDWITH; break;
591*b1cdbd2cSJim Jagielski default : eCurTok = END;
592*b1cdbd2cSJim Jagielski }
593*b1cdbd2cSJim Jagielski nCol1 = nOldCol1;
594*b1cdbd2cSJim Jagielski if( eCurTok == END )
595*b1cdbd2cSJim Jagielski {
596*b1cdbd2cSJim Jagielski // Alles zuruecksetzen, damit Token nach END ganz neu gelesen wird
597*b1cdbd2cSJim Jagielski ePush = NIL;
598*b1cdbd2cSJim Jagielski nLine = nOldLine;
599*b1cdbd2cSJim Jagielski nCol = nOldCol;
600*b1cdbd2cSJim Jagielski nCol2 = nOldCol2;
601*b1cdbd2cSJim Jagielski aSym = aOldSym;
602*b1cdbd2cSJim Jagielski RestoreLine(); // pLine im Scanner restaurieren
603*b1cdbd2cSJim Jagielski }
604*b1cdbd2cSJim Jagielski return eCurTok;
605*b1cdbd2cSJim Jagielski }
606*b1cdbd2cSJim Jagielski // Sind Datentypen Keywords?
607*b1cdbd2cSJim Jagielski // Nur nach AS, sonst sind es Symbole!
608*b1cdbd2cSJim Jagielski // Es gibt ja ERROR(), DATA(), STRING() etc.
609*b1cdbd2cSJim Jagielski eCurTok = tp->t;
610*b1cdbd2cSJim Jagielski // AS: Datentypen sind Keywords
611*b1cdbd2cSJim Jagielski if( tp->t == AS )
612*b1cdbd2cSJim Jagielski bAs = sal_True;
613*b1cdbd2cSJim Jagielski else
614*b1cdbd2cSJim Jagielski {
615*b1cdbd2cSJim Jagielski if( bAs )
616*b1cdbd2cSJim Jagielski bAs = sal_False;
617*b1cdbd2cSJim Jagielski else if( eCurTok >= DATATYPE1 && eCurTok <= DATATYPE2 && (bErrorIsSymbol || eCurTok != _ERROR_) )
618*b1cdbd2cSJim Jagielski eCurTok = SYMBOL;
619*b1cdbd2cSJim Jagielski }
620*b1cdbd2cSJim Jagielski
621*b1cdbd2cSJim Jagielski // CLASSMODULE, PROPERTY, GET, ENUM token only visible in compatible mode
622*b1cdbd2cSJim Jagielski SbiToken eTok = tp->t;
623*b1cdbd2cSJim Jagielski if( bCompatible )
624*b1cdbd2cSJim Jagielski {
625*b1cdbd2cSJim Jagielski // #129904 Suppress system
626*b1cdbd2cSJim Jagielski if( eTok == STOP && aSym.CompareIgnoreCaseToAscii( "system" ) == COMPARE_EQUAL )
627*b1cdbd2cSJim Jagielski eCurTok = SYMBOL;
628*b1cdbd2cSJim Jagielski
629*b1cdbd2cSJim Jagielski if( eTok == GET && bStartOfLine )
630*b1cdbd2cSJim Jagielski eCurTok = SYMBOL;
631*b1cdbd2cSJim Jagielski }
632*b1cdbd2cSJim Jagielski else
633*b1cdbd2cSJim Jagielski {
634*b1cdbd2cSJim Jagielski if( eTok == CLASSMODULE ||
635*b1cdbd2cSJim Jagielski eTok == IMPLEMENTS ||
636*b1cdbd2cSJim Jagielski eTok == PARAMARRAY ||
637*b1cdbd2cSJim Jagielski eTok == ENUM ||
638*b1cdbd2cSJim Jagielski eTok == PROPERTY ||
639*b1cdbd2cSJim Jagielski eTok == GET ||
640*b1cdbd2cSJim Jagielski eTok == TYPEOF )
641*b1cdbd2cSJim Jagielski {
642*b1cdbd2cSJim Jagielski eCurTok = SYMBOL;
643*b1cdbd2cSJim Jagielski }
644*b1cdbd2cSJim Jagielski }
645*b1cdbd2cSJim Jagielski
646*b1cdbd2cSJim Jagielski bEos = IsEoln( eCurTok );
647*b1cdbd2cSJim Jagielski return eCurTok;
648*b1cdbd2cSJim Jagielski }
649*b1cdbd2cSJim Jagielski
650*b1cdbd2cSJim Jagielski #ifdef _MSC_VER
651*b1cdbd2cSJim Jagielski #pragma optimize("",off)
652*b1cdbd2cSJim Jagielski #endif
653*b1cdbd2cSJim Jagielski
654*b1cdbd2cSJim Jagielski // Kann das aktuell eingelesene Token ein Label sein?
655*b1cdbd2cSJim Jagielski
MayBeLabel(sal_Bool bNeedsColon)656*b1cdbd2cSJim Jagielski sal_Bool SbiTokenizer::MayBeLabel( sal_Bool bNeedsColon )
657*b1cdbd2cSJim Jagielski {
658*b1cdbd2cSJim Jagielski if( eCurTok == SYMBOL || m_aTokenLabelInfo.canTokenBeLabel( eCurTok ) )
659*b1cdbd2cSJim Jagielski return bNeedsColon ? DoesColonFollow() : sal_True;
660*b1cdbd2cSJim Jagielski else
661*b1cdbd2cSJim Jagielski return sal_Bool( eCurTok == NUMBER
662*b1cdbd2cSJim Jagielski && eScanType == SbxINTEGER
663*b1cdbd2cSJim Jagielski && nVal >= 0 );
664*b1cdbd2cSJim Jagielski }
665*b1cdbd2cSJim Jagielski
666*b1cdbd2cSJim Jagielski #ifdef _MSC_VER
667*b1cdbd2cSJim Jagielski #pragma optimize("",off)
668*b1cdbd2cSJim Jagielski #endif
669*b1cdbd2cSJim Jagielski
670*b1cdbd2cSJim Jagielski
Hilite(SbTextPortions & rList)671*b1cdbd2cSJim Jagielski void SbiTokenizer::Hilite( SbTextPortions& rList )
672*b1cdbd2cSJim Jagielski {
673*b1cdbd2cSJim Jagielski bErrors = sal_False;
674*b1cdbd2cSJim Jagielski bUsedForHilite = sal_True;
675*b1cdbd2cSJim Jagielski SbiToken eLastTok = NIL;
676*b1cdbd2cSJim Jagielski for( ;; )
677*b1cdbd2cSJim Jagielski {
678*b1cdbd2cSJim Jagielski Next();
679*b1cdbd2cSJim Jagielski if( IsEof() )
680*b1cdbd2cSJim Jagielski break;
681*b1cdbd2cSJim Jagielski SbTextPortion aRes;
682*b1cdbd2cSJim Jagielski aRes.nLine = nLine;
683*b1cdbd2cSJim Jagielski aRes.nStart = nCol1;
684*b1cdbd2cSJim Jagielski aRes.nEnd = nCol2;
685*b1cdbd2cSJim Jagielski switch( eCurTok )
686*b1cdbd2cSJim Jagielski {
687*b1cdbd2cSJim Jagielski case REM:
688*b1cdbd2cSJim Jagielski aRes.eType = SB_COMMENT; break;
689*b1cdbd2cSJim Jagielski case SYMBOL:
690*b1cdbd2cSJim Jagielski aRes.eType = SB_SYMBOL; break;
691*b1cdbd2cSJim Jagielski case FIXSTRING:
692*b1cdbd2cSJim Jagielski aRes.eType = SB_STRING; break;
693*b1cdbd2cSJim Jagielski case NUMBER:
694*b1cdbd2cSJim Jagielski aRes.eType = SB_NUMBER; break;
695*b1cdbd2cSJim Jagielski default:
696*b1cdbd2cSJim Jagielski if( ( eCurTok >= FIRSTKWD && eCurTok <= LASTKWD )
697*b1cdbd2cSJim Jagielski || (eCurTok >= _CDECL_ ) )
698*b1cdbd2cSJim Jagielski aRes.eType = SB_KEYWORD;
699*b1cdbd2cSJim Jagielski else
700*b1cdbd2cSJim Jagielski aRes.eType = SB_PUNCTUATION;
701*b1cdbd2cSJim Jagielski }
702*b1cdbd2cSJim Jagielski // Die Folge xxx.Keyword sollte nicht als Kwd geflagt werden
703*b1cdbd2cSJim Jagielski if( aRes.eType == SB_KEYWORD
704*b1cdbd2cSJim Jagielski && ( eLastTok == DOT|| eLastTok == EXCLAM ) )
705*b1cdbd2cSJim Jagielski aRes.eType = SB_SYMBOL;
706*b1cdbd2cSJim Jagielski if( eCurTok != EOLN && aRes.nStart <= aRes.nEnd )
707*b1cdbd2cSJim Jagielski rList.Insert( aRes, rList.Count() );
708*b1cdbd2cSJim Jagielski if( aRes.eType == SB_COMMENT )
709*b1cdbd2cSJim Jagielski break;
710*b1cdbd2cSJim Jagielski eLastTok = eCurTok;
711*b1cdbd2cSJim Jagielski }
712*b1cdbd2cSJim Jagielski bUsedForHilite = sal_False;
713*b1cdbd2cSJim Jagielski }
714*b1cdbd2cSJim Jagielski
715