LibreOffice Module basic (master) 1
token.cxx
Go to the documentation of this file.
1/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2/*
3 * This file is part of the LibreOffice project.
4 *
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 *
9 * This file incorporates work covered by the following license notice:
10 *
11 * Licensed to the Apache Software Foundation (ASF) under one or more
12 * contributor license agreements. See the NOTICE file distributed
13 * with this work for additional information regarding copyright
14 * ownership. The ASF licenses this file to you under the Apache
15 * License, Version 2.0 (the "License"); you may not use this file
16 * except in compliance with the License. You may obtain a copy of
17 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 */
19
20
21#include <array>
22
23#include <basic/sberrors.hxx>
24#include <sal/macros.h>
25#include <o3tl/string_view.hxx>
26#include <basiccharclass.hxx>
27#include <token.hxx>
28
29namespace {
30
31struct TokenTable { SbiToken t; const char *s; };
32
33}
34
35const TokenTable aTokTable_Basic [] = {
36 { CAT, "&" },
37 { MUL, "*" },
38 { PLUS, "+" },
39 { MINUS, "-" },
40 { DIV, "/" },
41 { EOS, ":" },
42 { ASSIGN, ":=" },
43 { LT, "<" },
44 { LE, "<=" },
45 { NE, "<>" },
46 { EQ, "=" },
47 { GT, ">" },
48 { GE, ">=" },
49 { ACCESS, "Access" },
50 { ALIAS, "Alias" },
51 { AND, "And" },
52 { ANY, "Any" },
53 { APPEND, "Append" },
54 { AS, "As" },
55 { ATTRIBUTE,"Attribute" },
56 { BASE, "Base" },
57 { BINARY, "Binary" },
58 { TBOOLEAN, "Boolean" },
59 { BYREF, "ByRef", },
60 { TBYTE, "Byte", },
61 { BYVAL, "ByVal", },
62 { CALL, "Call" },
63 { CASE, "Case" },
64 { CDECL_, "Cdecl" },
65 { CLASSMODULE, "ClassModule" },
66 { CLOSE, "Close" },
67 { COMPARE, "Compare" },
68 { COMPATIBLE,"Compatible" },
69 { CONST_, "Const" },
70 { TCURRENCY,"Currency" },
71 { TDATE, "Date" },
72 { DECLARE, "Declare" },
73 { DEFBOOL, "DefBool" },
74 { DEFCUR, "DefCur" },
75 { DEFDATE, "DefDate" },
76 { DEFDBL, "DefDbl" },
77 { DEFERR, "DefErr" },
78 { DEFINT, "DefInt" },
79 { DEFLNG, "DefLng" },
80 { DEFOBJ, "DefObj" },
81 { DEFSNG, "DefSng" },
82 { DEFSTR, "DefStr" },
83 { DEFVAR, "DefVar" },
84 { DIM, "Dim" },
85 { DO, "Do" },
86 { TDOUBLE, "Double" },
87 { EACH, "Each" },
88 { ELSE, "Else" },
89 { ELSEIF, "ElseIf" },
90 { END, "End" },
91 { ENDENUM, "End Enum" },
92 { ENDFUNC, "End Function" },
93 { ENDIF, "End If" },
94 { ENDPROPERTY, "End Property" },
95 { ENDSELECT,"End Select" },
96 { ENDSUB, "End Sub" },
97 { ENDTYPE, "End Type" },
98 { ENDIF, "EndIf" },
99 { ENUM, "Enum" },
100 { EQV, "Eqv" },
101 { ERASE, "Erase" },
102 { ERROR_, "Error" },
103 { EXIT, "Exit" },
104 { BASIC_EXPLICIT, "Explicit" },
105 { FOR, "For" },
106 { FUNCTION, "Function" },
107 { GET, "Get" },
108 { GLOBAL, "Global" },
109 { GOSUB, "GoSub" },
110 { GOTO, "GoTo" },
111 { IF, "If" },
112 { IMP, "Imp" },
113 { IMPLEMENTS, "Implements" },
114 { IN_, "In" },
115 { INPUT, "Input" }, // also INPUT #
116 { TINTEGER, "Integer" },
117 { IS, "Is" },
118 { LET, "Let" },
119 { LIB, "Lib" },
120 { LIKE, "Like" },
121 { LINE, "Line" },
122 { LINEINPUT,"Line Input" },
123 { LOCAL, "Local" },
124 { LOCK, "Lock" },
125 { TLONG, "Long" },
126 { LOOP, "Loop" },
127 { LPRINT, "LPrint" },
128 { LSET, "LSet" }, // JSM
129 { MOD, "Mod" },
130 { NAME, "Name" },
131 { NEW, "New" },
132 { NEXT, "Next" },
133 { NOT, "Not" },
134 { TOBJECT, "Object" },
135 { ON, "On" },
136 { OPEN, "Open" },
137 { OPTION, "Option" },
138 { OPTIONAL_, "Optional" },
139 { OR, "Or" },
140 { OUTPUT, "Output" },
141 { PARAMARRAY, "ParamArray" },
142 { PRESERVE, "Preserve" },
143 { PRINT, "Print" },
144 { PRIVATE, "Private" },
145 { PROPERTY, "Property" },
146 { PTRSAFE, "PtrSafe" },
147 { PUBLIC, "Public" },
148 { RANDOM, "Random" },
149 { READ, "Read" },
150 { REDIM, "ReDim" },
151 { REM, "Rem" },
152 { RESUME, "Resume" },
153 { RETURN, "Return" },
154 { RSET, "RSet" }, // JSM
155 { SELECT, "Select" },
156 { SET, "Set" },
157 { SHARED, "Shared" },
158 { TSINGLE, "Single" },
159 { STATIC, "Static" },
160 { STEP, "Step" },
161 { STOP, "Stop" },
162 { TSTRING, "String" },
163 { SUB, "Sub" },
164 { STOP, "System" },
165 { TEXT, "Text" },
166 { THEN, "Then" },
167 { TO, "To", },
168 { TYPE, "Type" },
169 { TYPEOF, "TypeOf" },
170 { UNTIL, "Until" },
171 { TVARIANT, "Variant" },
172 { VBASUPPORT, "VbaSupport" },
173 { WEND, "Wend" },
174 { WHILE, "While" },
175 { WITH, "With" },
176 { WITHEVENTS, "WithEvents" },
177 { WRITE, "Write" }, // also WRITE #
178 { XOR, "Xor" },
179};
180
181namespace {
182
183// #i109076
184class TokenLabelInfo
185{
186 std::array<bool,VBASUPPORT+1> m_pTokenCanBeLabelTab;
187
188public:
189 TokenLabelInfo();
190
191 bool canTokenBeLabel( SbiToken eTok )
192 { return m_pTokenCanBeLabelTab[eTok]; }
193};
194
195}
196
197// #i109076
198TokenLabelInfo::TokenLabelInfo()
199{
200 m_pTokenCanBeLabelTab.fill(false);
201
202 // Token accepted as label by VBA
203 static const SbiToken eLabelToken[] = { ACCESS, ALIAS, APPEND, BASE, BINARY, CLASSMODULE,
206 for( SbiToken eTok : eLabelToken )
207 {
208 m_pTokenCanBeLabelTab[eTok] = true;
209 }
210}
211
212
213SbiTokenizer::SbiTokenizer( const OUString& rSrc, StarBASIC* pb )
214 : SbiScanner(rSrc, pb)
215 , eCurTok(NIL)
216 , ePush(NIL)
217 , nPLine(0)
218 , nPCol1(0)
219 , nPCol2(0)
220 , bEof(false)
221 , bEos(true)
222 , bAs(false)
223 , bErrorIsSymbol(true)
224{
225}
226
228{
229 if( ePush != NIL )
231 else ePush = t;
232}
233
234void SbiTokenizer::Error( ErrCode code, const OUString &aMsg )
235{
236 aError = aMsg;
237 Error( code );
238}
239
241{
242 aError = Symbol( tok );
243 Error( code );
244}
245
246// reading in the next token without absorbing it
247
249{
250 if( ePush == NIL )
251 {
252 sal_Int32 nOldLine = nLine;
253 sal_Int32 nOldCol1 = nCol1;
254 sal_Int32 nOldCol2 = nCol2;
255 ePush = Next();
256 nPLine = nLine; nLine = nOldLine;
257 nPCol1 = nCol1; nCol1 = nOldCol1;
258 nPCol2 = nCol2; nCol2 = nOldCol2;
259 }
260 eCurTok = ePush;
261 return eCurTok;
262}
263
264// For decompilation. Numbers and symbols return an empty string.
265
266const OUString& SbiTokenizer::Symbol( SbiToken t )
267{
268 // character token?
269 if( t < FIRSTKWD )
270 {
271 aSym = OUString(sal::static_int_cast<sal_Unicode>(t));
272 return aSym;
273 }
274 switch( t )
275 {
276 case NEG :
277 aSym = "-";
278 return aSym;
279 case EOS :
280 aSym = ":/CRLF";
281 return aSym;
282 case EOLN :
283 aSym = "CRLF";
284 return aSym;
285 default:
286 break;
287 }
288 for( auto& rTok : aTokTable_Basic )
289 {
290 if( rTok.t == t )
291 {
292 aSym = OStringToOUString(rTok.s, RTL_TEXTENCODING_ASCII_US);
293 return aSym;
294 }
295 }
296 const sal_Unicode *p = aSym.getStr();
297 if (*p <= ' ')
298 {
299 aSym = "???";
300 }
301 return aSym;
302}
303
304// Reading in the next token and put it down.
305// Tokens that don't appear in the token table
306// are directly returned as a character.
307// Some words are treated in a special way.
308
310{
311 if (bEof)
312 {
313 return EOLN;
314 }
315 // have read in one already?
316 if( ePush != NIL )
317 {
318 eCurTok = ePush;
319 ePush = NIL;
320 nLine = nPLine;
321 nCol1 = nPCol1;
322 nCol2 = nPCol2;
323 bEos = IsEoln( eCurTok );
324 return eCurTok;
325 }
326 const TokenTable *tp;
327
328 if( !NextSym() )
329 {
330 bEof = bEos = true;
331 eCurTok = EOLN;
332 return eCurTok;
333 }
334
335 if( aSym.startsWith("\n") )
336 {
337 bEos = true;
338 eCurTok = EOLN;
339 return eCurTok;
340 }
341 bEos = false;
342
343 if( bNumber )
344 {
345 eCurTok = NUMBER;
346 return eCurTok;
347 }
348 else if( ( eScanType == SbxDATE || eScanType == SbxSTRING ) && !bSymbol )
349 {
351 return eCurTok;
352 }
353 else if( aSym.isEmpty() )
354 {
355 //something went wrong
356 bEof = bEos = true;
357 eCurTok = EOLN;
358 return eCurTok;
359 }
360 // Special cases of characters that are between "Z" and "a". ICompare()
361 // evaluates the position of these characters in different ways.
362 else if( aSym[0] == '^' )
363 {
364 eCurTok = EXPON;
365 return eCurTok;
366 }
367 else if( aSym[0] == '\\' )
368 {
369 eCurTok = IDIV;
370 return eCurTok;
371 }
372 else
373 {
374 if( eScanType != SbxVARIANT )
375 {
376 eCurTok = SYMBOL;
377 return eCurTok;
378 }
379 // valid token?
380 short lb = 0;
381 short ub = std::size(aTokTable_Basic)-1;
382 short delta;
383 do
384 {
385 delta = (ub - lb) >> 1;
386 tp = &aTokTable_Basic[ lb + delta ];
387 sal_Int32 res = aSym.compareToIgnoreAsciiCaseAscii( tp->s );
388
389 if( res == 0 )
390 {
391 goto special;
392 }
393 if( res < 0 )
394 {
395 if ((ub - lb) == 2)
396 {
397 ub = lb;
398 }
399 else
400 {
401 ub = ub - delta;
402 }
403 }
404 else
405 {
406 if ((ub -lb) == 2)
407 {
408 lb = ub;
409 }
410 else
411 {
412 lb = lb + delta;
413 }
414 }
415 }
416 while( delta );
417 // Symbol? if not >= token
418 sal_Unicode ch = aSym[0];
420 {
421 eCurTok = static_cast<SbiToken>(ch & 0x00FF);
422 return eCurTok;
423 }
424 eCurTok = SYMBOL;
425 return eCurTok;
426 }
427special:
428 // #i92642
429 bool bStartOfLine = (eCurTok == NIL || eCurTok == REM || eCurTok == EOLN ||
430 eCurTok == THEN || eCurTok == ELSE); // single line If
431 if( !bStartOfLine && (tp->t == NAME || tp->t == LINE) )
432 {
433 eCurTok = SYMBOL;
434 return eCurTok;
435 }
436 else if( tp->t == TEXT )
437 {
438 eCurTok = SYMBOL;
439 return eCurTok;
440 }
441 // maybe we can expand this for other statements that have parameters
442 // that are keywords ( and those keywords are only used within such
443 // statements )
444 // what's happening here is that if we come across 'append' ( and we are
445 // not in the middle of parsing a special statement ( like 'Open')
446 // we just treat keyword 'append' as a normal 'SYMBOL'.
447 // Also we accept Dim APPEND
448 else if ( ( !bInStatement || eCurTok == DIM ) && tp->t == APPEND )
449 {
450 eCurTok = SYMBOL;
451 return eCurTok;
452 }
453 // #i92642: Special LINE token handling -> SbiParser::Line()
454
455 // END IF, CASE, SUB, DEF, FUNCTION, TYPE, CLASS, WITH
456 if( tp->t == END )
457 {
458 // from 15.3.96, special treatment for END, at Peek() the current
459 // time is lost, so memorize everything and restore after
460 sal_Int32 nOldLine = nLine;
461 sal_Int32 nOldCol = nCol;
462 sal_Int32 nOldCol1 = nCol1;
463 sal_Int32 nOldCol2 = nCol2;
464 OUString aOldSym = aSym;
465 SaveLine(); // save pLine in the scanner
466
467 eCurTok = Peek();
468 switch( eCurTok )
469 {
470 case IF: Next(); eCurTok = ENDIF; break;
471 case SELECT: Next(); eCurTok = ENDSELECT; break;
472 case SUB: Next(); eCurTok = ENDSUB; break;
473 case FUNCTION: Next(); eCurTok = ENDFUNC; break;
474 case PROPERTY: Next(); eCurTok = ENDPROPERTY; break;
475 case TYPE: Next(); eCurTok = ENDTYPE; break;
476 case ENUM: Next(); eCurTok = ENDENUM; break;
477 case WITH: Next(); eCurTok = ENDWITH; break;
478 default : eCurTok = END; break;
479 }
480 nCol1 = nOldCol1;
481 if( eCurTok == END )
482 {
483 // reset everything so that token is read completely newly after END
484 ePush = NIL;
485 nLine = nOldLine;
486 nCol = nOldCol;
487 nCol2 = nOldCol2;
488 aSym = aOldSym;
489 RestoreLine();
490 }
491 return eCurTok;
492 }
493 // are data types keywords?
494 // there is ERROR(), DATA(), STRING() etc.
495 eCurTok = tp->t;
496 // AS: data types are keywords
497 if( tp->t == AS )
498 {
499 bAs = true;
500 }
501 else
502 {
503 if( bAs )
504 {
505 bAs = false;
506 }
507 else if( eCurTok >= DATATYPE1 && eCurTok <= DATATYPE2 && (bErrorIsSymbol || eCurTok != ERROR_) )
508 {
509 eCurTok = SYMBOL;
510 }
511 }
512
513 // CLASSMODULE, PROPERTY, GET, ENUM token only visible in compatible mode
514 SbiToken eTok = tp->t;
515 if( bCompatible )
516 {
517 // #129904 Suppress system
518 if( eTok == STOP && aSym.equalsIgnoreAsciiCase("system") )
519 {
520 eCurTok = SYMBOL;
521 }
522 if( eTok == GET && bStartOfLine )
523 {
524 eCurTok = SYMBOL;
525 }
526 }
527 else
528 {
529 if( eTok == CLASSMODULE ||
530 eTok == IMPLEMENTS ||
531 eTok == PARAMARRAY ||
532 eTok == ENUM ||
533 eTok == PROPERTY ||
534 eTok == GET ||
535 eTok == TYPEOF )
536 {
537 eCurTok = SYMBOL;
538 }
539 }
540
541 bEos = IsEoln( eCurTok );
542 return eCurTok;
543}
544
545bool SbiTokenizer::MayBeLabel( bool bNeedsColon )
546{
547 static TokenLabelInfo gaStaticTokenLabelInfo;
548
549 if( eCurTok == SYMBOL || gaStaticTokenLabelInfo.canTokenBeLabel( eCurTok ) )
550 {
551 return !bNeedsColon || DoesColonFollow();
552 }
553 else
554 {
555 return ( eCurTok == NUMBER
557 && nVal >= 0 );
558 }
559}
560
561
562OUString SbiTokenizer::GetKeywordCase( std::u16string_view sKeyword )
563{
564 for( auto& rTok : aTokTable_Basic )
565 {
566 if( o3tl::equalsIgnoreAsciiCase(sKeyword, rTok.s) )
567 return OStringToOUString(rTok.s, RTL_TEXTENCODING_ASCII_US);
568 }
569 return OUString();
570}
571
572/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
NAME
XPropertyListType t
bool bInStatement
Definition: scanner.hxx:68
OUString aError
Definition: scanner.hxx:46
bool bSymbol
Definition: scanner.hxx:56
bool DoesColonFollow()
Definition: scanner.cxx:110
double nVal
Definition: scanner.hxx:48
sal_Int32 nCol
Definition: scanner.hxx:50
void RestoreLine()
Definition: scanner.hxx:85
OUString aSym
Definition: scanner.hxx:45
sal_Int32 nCol2
Definition: scanner.hxx:55
bool bCompatible
Definition: scanner.hxx:62
SbxDataType eScanType
Definition: scanner.hxx:47
sal_Int32 nCol1
Definition: scanner.hxx:55
bool NextSym()
Definition: scanner.cxx:212
void SaveLine()
Definition: scanner.hxx:84
bool bNumber
Definition: scanner.hxx:57
sal_Int32 nLine
Definition: scanner.hxx:54
SbiToken ePush
Definition: token.hxx:104
void Push(SbiToken)
Definition: token.cxx:227
sal_uInt16 nPCol1
Definition: token.hxx:105
static OUString GetKeywordCase(std::u16string_view sKeyword)
Definition: token.cxx:562
bool bEof
Definition: token.hxx:106
bool MayBeLabel(bool=false)
Definition: token.cxx:545
bool bAs
Definition: token.hxx:108
SbiToken Next()
Definition: token.cxx:309
sal_uInt16 nPLine
Definition: token.hxx:105
bool bErrorIsSymbol
Definition: token.hxx:109
static bool IsEoln(SbiToken t)
Definition: token.hxx:127
void Error(ErrCode c)
Definition: token.hxx:123
SbiToken Peek()
Definition: token.cxx:248
SbiToken eCurTok
Definition: token.hxx:103
const OUString & Symbol(SbiToken)
Definition: token.cxx:266
SbiTokenizer(const OUString &, StarBASIC *=nullptr)
Definition: token.cxx:213
sal_uInt16 nPCol2
Definition: token.hxx:105
bool bEos
Definition: token.hxx:107
void * p
bool isAlpha(sal_Unicode c, bool bCompatible)
bool equalsIgnoreAsciiCase(std::u16string_view s1, std::u16string_view s2)
END
sal_Unicode code
#define ERRCODE_BASIC_INTERNAL_ERROR
Definition: sberrors.hxx:33
@ SbxDATE
Definition: sbxdef.hxx:45
@ SbxVARIANT
Definition: sbxdef.hxx:51
@ SbxSTRING
Definition: sbxdef.hxx:46
@ SbxINTEGER
Definition: sbxdef.hxx:40
#define CONST_
Definition: stdobj.cxx:46
const TokenTable aTokTable_Basic[]
Definition: token.cxx:35
SbiToken
Definition: token.hxx:30
@ ENDTYPE
Definition: token.hxx:65
@ NOT
Definition: token.hxx:74
@ MUL
Definition: token.hxx:71
@ TOBJECT
Definition: token.hxx:48
@ AS
Definition: token.hxx:38
@ OPEN
Definition: token.hxx:58
@ PRIVATE
Definition: token.hxx:59
@ GET
Definition: token.hxx:54
@ NUMBER
Definition: token.hxx:78
@ SUB
Definition: token.hxx:61
@ GT
Definition: token.hxx:73
@ LIB
Definition: token.hxx:80
@ DEFSNG
Definition: token.hxx:43
@ MOD
Definition: token.hxx:72
@ SELECT
Definition: token.hxx:61
@ OPTIONAL_
Definition: token.hxx:80
@ CAT
Definition: token.hxx:75
@ REDIM
Definition: token.hxx:60
@ ALIAS
Definition: token.hxx:38
@ VBASUPPORT
Definition: token.hxx:98
@ DATATYPE1
Definition: token.hxx:46
@ EACH
Definition: token.hxx:52
@ IF
Definition: token.hxx:55
@ OUTPUT
Definition: token.hxx:79
@ ENDWITH
Definition: token.hxx:65
@ WEND
Definition: token.hxx:64
@ FIXSTRING
Definition: token.hxx:78
@ WHILE
Definition: token.hxx:64
@ TLONG
Definition: token.hxx:48
@ ERASE
Definition: token.hxx:52
@ PARAMARRAY
Definition: token.hxx:81
@ TCURRENCY
Definition: token.hxx:48
@ RESUME
Definition: token.hxx:60
@ DEFCUR
Definition: token.hxx:43
@ CLASSMODULE
Definition: token.hxx:81
@ ACCESS
Definition: token.hxx:79
@ LOCK
Definition: token.hxx:80
@ IMPLEMENTS
Definition: token.hxx:58
@ LT
Definition: token.hxx:73
@ TVARIANT
Definition: token.hxx:49
@ NE
Definition: token.hxx:73
@ DEFDBL
Definition: token.hxx:43
@ DEFBOOL
Definition: token.hxx:44
@ ENDFUNC
Definition: token.hxx:65
@ RETURN
Definition: token.hxx:60
@ TINTEGER
Definition: token.hxx:47
@ ASSIGN
Definition: token.hxx:38
@ GE
Definition: token.hxx:73
@ LINEINPUT
Definition: token.hxx:56
@ ENUM
Definition: token.hxx:62
@ PRESERVE
Definition: token.hxx:80
@ ENDENUM
Definition: token.hxx:65
@ ENDIF
Definition: token.hxx:65
@ CDECL_
Definition: token.hxx:78
@ DEFSTR
Definition: token.hxx:43
@ WRITE
Definition: token.hxx:64
@ LOOP
Definition: token.hxx:56
@ TYPEOF
Definition: token.hxx:75
@ BYREF
Definition: token.hxx:78
@ LE
Definition: token.hxx:73
@ DEFLNG
Definition: token.hxx:43
@ STOP
Definition: token.hxx:61
@ NAME
Definition: token.hxx:57
@ NIL
Definition: token.hxx:31
@ CLOSE
Definition: token.hxx:39
@ DIM
Definition: token.hxx:40
@ IS
Definition: token.hxx:75
@ REM
Definition: token.hxx:60
@ EQV
Definition: token.hxx:74
@ EXIT
Definition: token.hxx:52
@ TO
Definition: token.hxx:62
@ ELSEIF
Definition: token.hxx:52
@ IMP
Definition: token.hxx:75
@ ENDPROPERTY
Definition: token.hxx:65
@ DEFINT
Definition: token.hxx:43
@ DIV
Definition: token.hxx:72
@ GOSUB
Definition: token.hxx:54
@ AND
Definition: token.hxx:74
@ IN_
Definition: token.hxx:55
@ PLUS
Definition: token.hxx:72
@ ENDSELECT
Definition: token.hxx:65
@ TBYTE
Definition: token.hxx:49
@ ELSE
Definition: token.hxx:52
@ DEFVAR
Definition: token.hxx:44
@ ENDSUB
Definition: token.hxx:65
@ WITHEVENTS
Definition: token.hxx:81
@ OR
Definition: token.hxx:74
@ PROPERTY
Definition: token.hxx:59
@ ON
Definition: token.hxx:58
@ TEXT
Definition: token.hxx:62
@ EOLN
Definition: token.hxx:69
@ ATTRIBUTE
Definition: token.hxx:58
@ FIRSTKWD
Definition: token.hxx:37
@ SHARED
Definition: token.hxx:61
@ CASE
Definition: token.hxx:39
@ EQ
Definition: token.hxx:73
@ ANY
Definition: token.hxx:80
@ RANDOM
Definition: token.hxx:79
@ LIKE
Definition: token.hxx:75
@ DATATYPE2
Definition: token.hxx:50
@ UNTIL
Definition: token.hxx:63
@ BASE
Definition: token.hxx:80
@ FOR
Definition: token.hxx:53
@ TDOUBLE
Definition: token.hxx:48
@ OPTION
Definition: token.hxx:58
@ DECLARE
Definition: token.hxx:40
@ PTRSAFE
Definition: token.hxx:80
@ FUNCTION
Definition: token.hxx:53
@ LINE
Definition: token.hxx:56
@ PRINT
Definition: token.hxx:59
@ RSET
Definition: token.hxx:60
@ NEXT
Definition: token.hxx:57
@ COMPATIBLE
Definition: token.hxx:81
@ BYVAL
Definition: token.hxx:78
@ SET
Definition: token.hxx:61
@ TYPE
Definition: token.hxx:62
@ ERROR_
Definition: token.hxx:49
@ THEN
Definition: token.hxx:62
@ CALL
Definition: token.hxx:39
@ DO
Definition: token.hxx:40
@ STEP
Definition: token.hxx:61
@ DEFDATE
Definition: token.hxx:43
@ XOR
Definition: token.hxx:74
@ READ
Definition: token.hxx:80
@ LOCAL
Definition: token.hxx:56
@ TSINGLE
Definition: token.hxx:48
@ TSTRING
Definition: token.hxx:48
@ DEFERR
Definition: token.hxx:44
@ LPRINT
Definition: token.hxx:56
@ END
Definition: token.hxx:52
@ LSET
Definition: token.hxx:56
@ BASIC_EXPLICIT
Definition: token.hxx:81
@ GOTO
Definition: token.hxx:54
@ EXPON
Definition: token.hxx:71
@ DEFOBJ
Definition: token.hxx:43
@ INPUT
Definition: token.hxx:55
@ SYMBOL
Definition: token.hxx:78
@ EOS
Definition: token.hxx:69
@ STATIC
Definition: token.hxx:61
@ PUBLIC
Definition: token.hxx:59
@ TDATE
Definition: token.hxx:48
@ TBOOLEAN
Definition: token.hxx:49
@ NEW
Definition: token.hxx:57
@ BINARY
Definition: token.hxx:79
@ APPEND
Definition: token.hxx:79
@ MINUS
Definition: token.hxx:72
@ NEG
Definition: token.hxx:71
@ LET
Definition: token.hxx:56
@ WITH
Definition: token.hxx:64
@ IDIV
Definition: token.hxx:72
@ GLOBAL
Definition: token.hxx:54
@ COMPARE
Definition: token.hxx:39
sal_uInt16 sal_Unicode