| /************************************************************** |
| * |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| * |
| *************************************************************/ |
| |
| |
| |
| #ifndef _TOKEN_HXX |
| #define _TOKEN_HXX |
| |
| #include "scanner.hxx" |
| #ifndef _SBDEF_HXX |
| #include <basic/sbdef.hxx> |
| #endif |
| |
| #if defined( SHARED ) |
| #define SbiTokenSHAREDTMPUNDEF |
| #undef SHARED |
| #endif |
| |
| // Der Tokenizer ist stand-alone, d.h. er kann von ueberallher verwendet |
| // werden. Eine BASIC-Instanz ist fuer Fehlermeldungen notwendig. Ohne |
| // BASIC werden die Fehler nur gezaehlt. Auch ist Basic notwendig, wenn |
| // eine erweiterte SBX-Variable zur Erkennung von Datentypen etc. verwendet |
| // werden soll. |
| |
| enum SbiToken { |
| NIL = 0, |
| // Token zwischen 0x20 und 0x3F sind Literale: |
| LPAREN = '(', RPAREN = ')', COMMA = ',', DOT = '.', EXCLAM = '!', |
| HASH = '#', SEMICOLON = ';', |
| |
| // Anweisungen: |
| FIRSTKWD = 0x40, |
| AS = FIRSTKWD, ALIAS, ASSIGN, |
| CALL, CASE, CLOSE, COMPARE, _CONST_, |
| DECLARE, DIM, DO, |
| |
| // in der Reihenfolge der Datentyp-Enums! |
| DEFINT, DEFLNG, DEFSNG, DEFDBL, DEFCUR, DEFDATE, DEFSTR, DEFOBJ, |
| DEFERR, DEFBOOL, DEFVAR, |
| // in der Reihenfolge der Datentyp-Enums! |
| DATATYPE1, |
| TINTEGER = DATATYPE1, |
| TLONG, TSINGLE, TDOUBLE, TCURRENCY, TDATE, TSTRING, TOBJECT, |
| _ERROR_, TBOOLEAN, TVARIANT, TBYTE, |
| DATATYPE2 = TBYTE, |
| |
| EACH, ELSE, ELSEIF, END, ERASE, EXIT, |
| FOR, FUNCTION, |
| GET, GLOBAL, GOSUB, GOTO, |
| IF, _IN_, INPUT, |
| LET, LINE, LINEINPUT, LOCAL, LOOP, LPRINT, LSET, |
| NAME, NEW, NEXT, |
| ON, OPEN, OPTION, IMPLEMENTS, |
| PRINT, PRIVATE, PROPERTY, PUBLIC, |
| REDIM, REM, RESUME, RETURN, RSET, |
| SELECT, SET, SHARED, STATIC, STEP, STOP, SUB, |
| TEXT, THEN, TO, TYPE, ENUM, |
| UNTIL, |
| WEND, WHILE, WITH, WRITE, |
| ENDENUM, ENDIF, ENDFUNC, ENDPROPERTY, ENDSUB, ENDTYPE, ENDSELECT, ENDWITH, |
| // Ende aller Keywords |
| LASTKWD = ENDWITH, |
| // Statement-Ende |
| EOS, EOLN, |
| // Operatoren: |
| EXPON, NEG, MUL, |
| DIV, IDIV, MOD, PLUS, MINUS, |
| EQ, NE, LT, GT, LE, GE, |
| NOT, AND, OR, XOR, EQV, |
| IMP, CAT, LIKE, IS, TYPEOF, |
| // Sonstiges: |
| FIRSTEXTRA, |
| NUMBER=FIRSTEXTRA, FIXSTRING, SYMBOL, _CDECL_, BYVAL, BYREF, |
| OUTPUT, RANDOM, APPEND, BINARY, ACCESS, |
| LOCK, READ, PRESERVE, BASE, ANY, LIB, _OPTIONAL_, |
| BASIC_EXPLICIT, COMPATIBLE, CLASSMODULE, PARAMARRAY, WITHEVENTS, |
| |
| // Ab hier kommen JavaScript-Tokens (gleiches enum, damit gleicher Typ) |
| FIRSTJAVA, |
| JS_BREAK=FIRSTJAVA, JS_CONTINUE, JS_FOR, JS_FUNCTION, JS_IF, JS_NEW, |
| JS_RETURN, JS_THIS, JS_VAR, JS_WHILE, JS_WITH, |
| |
| // JavaScript-Operatoren |
| // _ASS_ = Assignment |
| JS_COMMA, JS_ASSIGNMENT, JS_ASS_PLUS, JS_ASS_MINUS, JS_ASS_MUL, |
| JS_ASS_DIV, JS_ASS_MOD, JS_ASS_LSHIFT, JS_ASS_RSHIFT, JS_ASS_RSHIFT_Z, |
| JS_ASS_AND, JS_ASS_XOR, JS_ASS_OR, |
| JS_COND_QUEST, JS_COND_SEL, JS_LOG_OR, JS_LOG_AND, JS_BIT_OR, |
| JS_BIT_XOR, JS_BIT_AND, JS_EQ, JS_NE, JS_LT, JS_LE, |
| JS_GT, JS_GE, JS_LSHIFT, JS_RSHIFT, JS_RSHIFT_Z, |
| JS_PLUS, JS_MINUS, JS_MUL, JS_DIV, JS_MOD, JS_LOG_NOT, JS_BIT_NOT, |
| JS_INC, JS_DEC, JS_LPAREN, JS_RPAREN, JS_LINDEX, JS_RINDEX |
| , VBASUPPORT |
| }; |
| |
| #ifdef SbiTokenSHAREDTMPUNDEF |
| #define SHARED |
| #undef SbiTokenSHAREDTMPUNDEF |
| #endif |
| |
| // #i109076 |
| class TokenLabelInfo |
| { |
| bool* m_pTokenCanBeLabelTab; |
| |
| public: |
| TokenLabelInfo( void ); |
| TokenLabelInfo( const TokenLabelInfo& rInfo ) |
| : m_pTokenCanBeLabelTab( NULL ) |
| { (void)rInfo; } |
| ~TokenLabelInfo(); |
| |
| bool canTokenBeLabel( SbiToken eTok ) |
| { return m_pTokenCanBeLabelTab[eTok]; } |
| }; |
| |
| class SbiTokenizer : public SbiScanner { |
| TokenLabelInfo m_aTokenLabelInfo; |
| |
| protected: |
| SbiToken eCurTok; // aktuelles Token |
| SbiToken ePush; // Pushback-Token |
| sal_uInt16 nPLine, nPCol1, nPCol2; // Pushback-Location |
| sal_Bool bEof; // sal_True bei Dateiende |
| sal_Bool bEos; // sal_True bei Statement-Ende |
| sal_Bool bKeywords; // sal_True, falls Keywords geparst werden |
| sal_Bool bAs; // letztes Keyword war AS |
| sal_Bool bErrorIsSymbol; // Handle Error token as Symbol, not keyword |
| public: |
| SbiTokenizer( const ::rtl::OUString&, StarBASIC* = NULL ); |
| ~SbiTokenizer(); |
| |
| inline sal_Bool IsEof() { return bEof; } |
| inline sal_Bool IsEos() { return bEos; } |
| |
| void Push( SbiToken ); // Pushback eines Tokens |
| const String& Symbol( SbiToken );// Rueckumwandlung |
| |
| SbiToken Peek(); // das naechste Token lesen |
| SbiToken Next(); // Ein Token lesen |
| sal_Bool MayBeLabel( sal_Bool= sal_False ); // Kann es ein Label sein? |
| |
| void Hilite( SbTextPortions& ); // Syntax-Highlighting |
| |
| void Error( SbError c ) { GenError( c ); } |
| void Error( SbError, SbiToken ); |
| void Error( SbError, const char* ); |
| void Error( SbError, String ); |
| |
| void Keywords( sal_Bool b ) { bKeywords = b; } |
| |
| static sal_Bool IsEoln( SbiToken t ) |
| { return sal_Bool( t == EOS || t == EOLN || t == REM ); } |
| static sal_Bool IsKwd( SbiToken t ) |
| { return sal_Bool( t >= FIRSTKWD && t <= LASTKWD ); } |
| static sal_Bool IsExtra( SbiToken t ) |
| { return sal_Bool( t >= FIRSTEXTRA ); } |
| }; |
| |
| |
| #endif |