Branch data Line data Source code
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 : : #ifndef _TOKEN_HXX
21 : : #define _TOKEN_HXX
22 : :
23 : : #include "scanner.hxx"
24 : : #include <basic/sbdef.hxx>
25 : :
26 : : #if defined( SHARED )
27 : : #define SbiTokenSHAREDTMPUNDEF
28 : : #undef SHARED
29 : : #endif
30 : :
31 : : // The tokenizer is stand-alone, i. e. he can be used from everywhere.
32 : : // A BASIC-instance is necessary for error messages. Without BASIC the
33 : : // errors are only counted. The BASIC is also necessary when an advanced
34 : : // SBX-variable shall be used for recognition of data types etc.
35 : :
36 : :
37 : : enum SbiToken {
38 : : NIL = 0,
39 : : // tokens between 0x20 and 0x3F are literals:
40 : : LPAREN = '(', RPAREN = ')', COMMA = ',', DOT = '.', EXCLAM = '!',
41 : : HASH = '#', SEMICOLON = ';',
42 : :
43 : : // commands:
44 : : FIRSTKWD = 0x40,
45 : : AS = FIRSTKWD, ALIAS, ASSIGN,
46 : : CALL, CASE, CLOSE, COMPARE, _CONST_,
47 : : DECLARE, DIM, DO,
48 : :
49 : : // in the order of the data type enums!
50 : : DEFINT, DEFLNG, DEFSNG, DEFDBL, DEFCUR, DEFDATE, DEFSTR, DEFOBJ,
51 : : DEFERR, DEFBOOL, DEFVAR,
52 : : // in the order of the data type enums!
53 : : DATATYPE1,
54 : : TINTEGER = DATATYPE1,
55 : : TLONG, TSINGLE, TDOUBLE, TCURRENCY, TDATE, TSTRING, TOBJECT,
56 : : _ERROR_, TBOOLEAN, TVARIANT, TBYTE,
57 : : DATATYPE2 = TBYTE,
58 : :
59 : : EACH, ELSE, ELSEIF, END, ERASE, EXIT,
60 : : FOR, FUNCTION,
61 : : GET, GLOBAL, GOSUB, GOTO,
62 : : IF, _IN_, INPUT,
63 : : LET, LINE, LINEINPUT, LOCAL, LOOP, LPRINT, LSET,
64 : : NAME, NEW, NEXT,
65 : : ON, OPEN, OPTION, ATTRIBUTE, IMPLEMENTS,
66 : : PRINT, PRIVATE, PROPERTY, PUBLIC,
67 : : REDIM, REM, RESUME, RETURN, RSET,
68 : : SELECT, SET, SHARED, STATIC, STEP, STOP, SUB,
69 : : TEXT, THEN, TO, TYPE, ENUM,
70 : : UNTIL,
71 : : WEND, WHILE, WITH, WRITE,
72 : : ENDENUM, ENDIF, ENDFUNC, ENDPROPERTY, ENDSUB, ENDTYPE, ENDSELECT, ENDWITH,
73 : : // end of all keywords
74 : : LASTKWD = ENDWITH,
75 : : // statement end
76 : : EOS, EOLN,
77 : : // operators:
78 : : EXPON, NEG, MUL,
79 : : DIV, IDIV, MOD, PLUS, MINUS,
80 : : EQ, NE, LT, GT, LE, GE,
81 : : NOT, AND, OR, XOR, EQV,
82 : : IMP, CAT, LIKE, IS, TYPEOF,
83 : : // miscellaneous:
84 : : FIRSTEXTRA,
85 : : NUMBER=FIRSTEXTRA, FIXSTRING, SYMBOL, _CDECL_, BYVAL, BYREF,
86 : : OUTPUT, RANDOM, APPEND, BINARY, ACCESS,
87 : : LOCK, READ, PRESERVE, BASE, ANY, LIB, _OPTIONAL_,
88 : : EXPLICIT, COMPATIBLE, CLASSMODULE, PARAMARRAY, WITHEVENTS,
89 : :
90 : : // from here there are JavaScript-tokens (same enum so that same type)
91 : : FIRSTJAVA,
92 : : JS_BREAK=FIRSTJAVA, JS_CONTINUE, JS_FOR, JS_FUNCTION, JS_IF, JS_NEW,
93 : : JS_RETURN, JS_THIS, JS_VAR, JS_WHILE, JS_WITH,
94 : :
95 : : // JavaScript-operators
96 : : // _ASS_ = Assignment
97 : : JS_COMMA, JS_ASSIGNMENT, JS_ASS_PLUS, JS_ASS_MINUS, JS_ASS_MUL,
98 : : JS_ASS_DIV, JS_ASS_MOD, JS_ASS_LSHIFT, JS_ASS_RSHIFT, JS_ASS_RSHIFT_Z,
99 : : JS_ASS_AND, JS_ASS_XOR, JS_ASS_OR,
100 : : JS_COND_QUEST, JS_COND_SEL, JS_LOG_OR, JS_LOG_AND, JS_BIT_OR,
101 : : JS_BIT_XOR, JS_BIT_AND, JS_EQ, JS_NE, JS_LT, JS_LE,
102 : : JS_GT, JS_GE, JS_LSHIFT, JS_RSHIFT, JS_RSHIFT_Z,
103 : : JS_PLUS, JS_MINUS, JS_MUL, JS_DIV, JS_MOD, JS_LOG_NOT, JS_BIT_NOT,
104 : : JS_INC, JS_DEC, JS_LPAREN, JS_RPAREN, JS_LINDEX, JS_RINDEX
105 : : , VBASUPPORT
106 : : };
107 : :
108 : : #ifdef SbiTokenSHAREDTMPUNDEF
109 : : #define SHARED
110 : : #undef SbiTokenSHAREDTMPUNDEF
111 : : #endif
112 : :
113 : : // #i109076
114 : : class TokenLabelInfo
115 : : {
116 : : bool* m_pTokenCanBeLabelTab;
117 : :
118 : : public:
119 : : TokenLabelInfo( void );
120 : 1037 : TokenLabelInfo( const TokenLabelInfo& rInfo )
121 : 1037 : : m_pTokenCanBeLabelTab( NULL )
122 : 1037 : { (void)rInfo; }
123 : : ~TokenLabelInfo();
124 : :
125 : 1445 : bool canTokenBeLabel( SbiToken eTok )
126 : 1445 : { return m_pTokenCanBeLabelTab[eTok]; }
127 : : };
128 : :
129 : 1037 : class SbiTokenizer : public SbiScanner {
130 : : TokenLabelInfo m_aTokenLabelInfo;
131 : :
132 : : protected:
133 : : SbiToken eCurTok;
134 : : SbiToken ePush;
135 : : sal_uInt16 nPLine, nPCol1, nPCol2; // pushback location
136 : : bool bEof;
137 : : bool bEos;
138 : : bool bKeywords; // true, if keywords are parsed
139 : : bool bAs; // last keyword was AS
140 : : bool bErrorIsSymbol; // Handle Error token as Symbol, not keyword
141 : : public:
142 : : SbiTokenizer( const ::rtl::OUString&, StarBASIC* = NULL );
143 : : ~SbiTokenizer();
144 : :
145 : 38176 : inline bool IsEof() { return bEof; }
146 : 3310 : inline bool IsEos() { return bEos; }
147 : :
148 : : void Push( SbiToken );
149 : : const ::rtl::OUString& Symbol( SbiToken ); // reconversion
150 : :
151 : : SbiToken Peek(); // read the next token
152 : : SbiToken Next(); // read a token
153 : : bool MayBeLabel( bool= false );
154 : :
155 : 0 : void Error( SbError c ) { GenError( c ); }
156 : : void Error( SbError, SbiToken );
157 : : void Error( SbError, const char* );
158 : : void Error( SbError, const ::rtl::OUString &);
159 : :
160 : 49887 : static bool IsEoln( SbiToken t )
161 [ + + ][ + + ]: 49887 : { return t == EOS || t == EOLN || t == REM; }
[ + + ]
162 : 5214 : static bool IsKwd( SbiToken t )
163 [ + - ][ + + ]: 5214 : { return t >= FIRSTKWD && t <= LASTKWD; }
164 : 0 : static bool IsExtra( SbiToken t )
165 : 0 : { return t >= FIRSTEXTRA; }
166 : : };
167 : :
168 : :
169 : : #endif
170 : :
171 : : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|