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 #ifndef _SCANNER_HXX 25*b1cdbd2cSJim Jagielski #define _SCANNER_HXX 26*b1cdbd2cSJim Jagielski 27*b1cdbd2cSJim Jagielski #include <tools/string.hxx> 28*b1cdbd2cSJim Jagielski #ifndef _SBERRORS_HXX 29*b1cdbd2cSJim Jagielski #include <basic/sberrors.hxx> 30*b1cdbd2cSJim Jagielski #endif 31*b1cdbd2cSJim Jagielski 32*b1cdbd2cSJim Jagielski // Der Scanner ist stand-alone, d.h. er kann von ueberallher verwendet 33*b1cdbd2cSJim Jagielski // werden. Eine BASIC-Instanz ist fuer Fehlermeldungen notwendig. Ohne 34*b1cdbd2cSJim Jagielski // BASIC werden die Fehler nur gezaehlt. Auch ist Basic notwendig, wenn 35*b1cdbd2cSJim Jagielski // eine erweiterte SBX-Variable zur Erkennung von Datentypen etc. verwendet 36*b1cdbd2cSJim Jagielski // werden soll. 37*b1cdbd2cSJim Jagielski 38*b1cdbd2cSJim Jagielski class StarBASIC; 39*b1cdbd2cSJim Jagielski 40*b1cdbd2cSJim Jagielski class SbiScanner 41*b1cdbd2cSJim Jagielski { 42*b1cdbd2cSJim Jagielski ::rtl::OUString aBuf; // Input-Puffer 43*b1cdbd2cSJim Jagielski ::rtl::OUString aLine; // aktuelle Zeile 44*b1cdbd2cSJim Jagielski const sal_Unicode* pLine; // Pointer 45*b1cdbd2cSJim Jagielski const sal_Unicode* pSaveLine; // Merker fuer Line 46*b1cdbd2cSJim Jagielski protected: 47*b1cdbd2cSJim Jagielski String aSym; // Symbolpuffer 48*b1cdbd2cSJim Jagielski String aError; // Fehler-String 49*b1cdbd2cSJim Jagielski SbxDataType eScanType; // evtl. Datentyp 50*b1cdbd2cSJim Jagielski StarBASIC* pBasic; // Instanz fuer Fehler-Callbacks 51*b1cdbd2cSJim Jagielski double nVal; // numerischer Wert 52*b1cdbd2cSJim Jagielski short nCurCol1; // aktuelle Spalte 1 53*b1cdbd2cSJim Jagielski short nSavedCol1; // gerettete Spalte 1 54*b1cdbd2cSJim Jagielski short nCol; // aktuelle Spaltennummer 55*b1cdbd2cSJim Jagielski short nErrors; // Anzahl Fehler 56*b1cdbd2cSJim Jagielski short nColLock; // Lock-Zaehler fuer Col1 57*b1cdbd2cSJim Jagielski sal_Int32 nBufPos; // aktuelle Buffer-Pos 58*b1cdbd2cSJim Jagielski sal_uInt16 nLine; // aktuelle Zeile 59*b1cdbd2cSJim Jagielski sal_uInt16 nCol1, nCol2; // aktuelle 1. und 2. Spalte 60*b1cdbd2cSJim Jagielski sal_Bool bSymbol; // sal_True: Symbol gescannt 61*b1cdbd2cSJim Jagielski sal_Bool bNumber; // sal_True: Zahl gescannt 62*b1cdbd2cSJim Jagielski sal_Bool bSpaces; // sal_True: Whitespace vor Token 63*b1cdbd2cSJim Jagielski sal_Bool bErrors; // sal_True: Fehler generieren 64*b1cdbd2cSJim Jagielski sal_Bool bAbort; // sal_True: abbrechen 65*b1cdbd2cSJim Jagielski sal_Bool bHash; // sal_True: # eingelesen 66*b1cdbd2cSJim Jagielski sal_Bool bError; // sal_True: Fehler generieren 67*b1cdbd2cSJim Jagielski sal_Bool bUsedForHilite; // sal_True: Nutzung fuer Highlighting 68*b1cdbd2cSJim Jagielski sal_Bool bCompatible; // sal_True: OPTION Compatibl 69*b1cdbd2cSJim Jagielski sal_Bool bVBASupportOn; // sal_True: OPTION VBASupport 1 otherwise default False 70*b1cdbd2cSJim Jagielski sal_Bool bPrevLineExtentsComment; // sal_True: Previous line is comment and ends on "... _" 71*b1cdbd2cSJim Jagielski 72*b1cdbd2cSJim Jagielski void GenError( SbError ); 73*b1cdbd2cSJim Jagielski public: 74*b1cdbd2cSJim Jagielski SbiScanner( const ::rtl::OUString&, StarBASIC* = NULL ); 75*b1cdbd2cSJim Jagielski ~SbiScanner(); 76*b1cdbd2cSJim Jagielski EnableErrors()77*b1cdbd2cSJim Jagielski void EnableErrors() { bError = sal_False; } IsHash()78*b1cdbd2cSJim Jagielski sal_Bool IsHash() { return bHash; } IsCompatible()79*b1cdbd2cSJim Jagielski sal_Bool IsCompatible() { return bCompatible; } SetCompatible(bool b)80*b1cdbd2cSJim Jagielski void SetCompatible( bool b ) { bCompatible = b; } // #118206 IsVBASupportOn()81*b1cdbd2cSJim Jagielski sal_Bool IsVBASupportOn() { return bVBASupportOn; } SetVBASupportOn(bool b)82*b1cdbd2cSJim Jagielski void SetVBASupportOn( bool b ) { bVBASupportOn = b; } WhiteSpace()83*b1cdbd2cSJim Jagielski sal_Bool WhiteSpace() { return bSpaces; } GetErrors()84*b1cdbd2cSJim Jagielski short GetErrors() { return nErrors; } GetLine()85*b1cdbd2cSJim Jagielski short GetLine() { return nLine; } GetCol1()86*b1cdbd2cSJim Jagielski short GetCol1() { return nCol1; } GetCol2()87*b1cdbd2cSJim Jagielski short GetCol2() { return nCol2; } SetCol1(short n)88*b1cdbd2cSJim Jagielski void SetCol1( short n ) { nCol1 = n; } GetBasic()89*b1cdbd2cSJim Jagielski StarBASIC* GetBasic() { return pBasic; } SaveLine(void)90*b1cdbd2cSJim Jagielski void SaveLine(void) { pSaveLine = pLine; } RestoreLine(void)91*b1cdbd2cSJim Jagielski void RestoreLine(void) { pLine = pSaveLine; } 92*b1cdbd2cSJim Jagielski void LockColumn(); 93*b1cdbd2cSJim Jagielski void UnlockColumn(); 94*b1cdbd2cSJim Jagielski sal_Bool DoesColonFollow(); 95*b1cdbd2cSJim Jagielski 96*b1cdbd2cSJim Jagielski sal_Bool NextSym(); // naechstes Symbol lesen GetSym()97*b1cdbd2cSJim Jagielski const String& GetSym() { return aSym; } GetType()98*b1cdbd2cSJim Jagielski SbxDataType GetType() { return eScanType; } GetDbl()99*b1cdbd2cSJim Jagielski double GetDbl() { return nVal; } 100*b1cdbd2cSJim Jagielski }; 101*b1cdbd2cSJim Jagielski 102*b1cdbd2cSJim Jagielski class LetterTable 103*b1cdbd2cSJim Jagielski { 104*b1cdbd2cSJim Jagielski bool IsLetterTab[256]; 105*b1cdbd2cSJim Jagielski 106*b1cdbd2cSJim Jagielski public: 107*b1cdbd2cSJim Jagielski LetterTable( void ); 108*b1cdbd2cSJim Jagielski isLetter(sal_Unicode c)109*b1cdbd2cSJim Jagielski inline bool isLetter( sal_Unicode c ) 110*b1cdbd2cSJim Jagielski { 111*b1cdbd2cSJim Jagielski bool bRet = (c < 256) ? IsLetterTab[c] : isLetterUnicode( c ); 112*b1cdbd2cSJim Jagielski return bRet; 113*b1cdbd2cSJim Jagielski } 114*b1cdbd2cSJim Jagielski bool isLetterUnicode( sal_Unicode c ); 115*b1cdbd2cSJim Jagielski }; 116*b1cdbd2cSJim Jagielski 117*b1cdbd2cSJim Jagielski class BasicSimpleCharClass 118*b1cdbd2cSJim Jagielski { 119*b1cdbd2cSJim Jagielski static LetterTable aLetterTable; 120*b1cdbd2cSJim Jagielski 121*b1cdbd2cSJim Jagielski public: isAlpha(sal_Unicode c,bool bCompatible)122*b1cdbd2cSJim Jagielski static sal_Bool isAlpha( sal_Unicode c, bool bCompatible ) 123*b1cdbd2cSJim Jagielski { 124*b1cdbd2cSJim Jagielski sal_Bool bRet = (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') 125*b1cdbd2cSJim Jagielski || (bCompatible && aLetterTable.isLetter( c )); 126*b1cdbd2cSJim Jagielski return bRet; 127*b1cdbd2cSJim Jagielski } 128*b1cdbd2cSJim Jagielski isDigit(sal_Unicode c)129*b1cdbd2cSJim Jagielski static sal_Bool isDigit( sal_Unicode c ) 130*b1cdbd2cSJim Jagielski { 131*b1cdbd2cSJim Jagielski sal_Bool bRet = (c >= '0' && c <= '9'); 132*b1cdbd2cSJim Jagielski return bRet; 133*b1cdbd2cSJim Jagielski } 134*b1cdbd2cSJim Jagielski isAlphaNumeric(sal_Unicode c,bool bCompatible)135*b1cdbd2cSJim Jagielski static sal_Bool isAlphaNumeric( sal_Unicode c, bool bCompatible ) 136*b1cdbd2cSJim Jagielski { 137*b1cdbd2cSJim Jagielski sal_Bool bRet = isDigit( c ) || isAlpha( c, bCompatible ); 138*b1cdbd2cSJim Jagielski return bRet; 139*b1cdbd2cSJim Jagielski } 140*b1cdbd2cSJim Jagielski }; 141*b1cdbd2cSJim Jagielski 142*b1cdbd2cSJim Jagielski #endif 143