summaryrefslogtreecommitdiff
path: root/basic/source/comp/token.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'basic/source/comp/token.cxx')
-rw-r--r--basic/source/comp/token.cxx557
1 files changed, 0 insertions, 557 deletions
diff --git a/basic/source/comp/token.cxx b/basic/source/comp/token.cxx
deleted file mode 100644
index e30aea8d25..0000000000
--- a/basic/source/comp/token.cxx
+++ /dev/null
@@ -1,557 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2000, 2010 Oracle and/or its affiliates.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-
-// MARKER(update_precomp.py): autogen include statement, do not remove
-#include "precompiled_basic.hxx"
-
-#include <ctype.h>
-#include "sbcomp.hxx"
-
-struct TokenTable { SbiToken t; const char *s; };
-
-static short nToken; // Anzahl der Tokens
-
-static TokenTable* pTokTable;
-
-static TokenTable aTokTable_Basic [] = { // Token-Tabelle:
-
- { CAT, "&" },
- { MUL, "*" },
- { PLUS, "+" },
- { MINUS, "-" },
- { DIV, "/" },
- { EOS, ":" },
- { ASSIGN, ":=" },
- { LT, "<" },
- { LE, "<=" },
- { NE, "<>" },
- { EQ, "=" },
- { GT, ">" },
- { GE, ">=" },
- { ACCESS, "Access" },
- { ALIAS, "Alias" },
- { AND, "And" },
- { ANY, "Any" },
- { APPEND, "Append" },
- { AS, "As" },
- { ATTRIBUTE,"Attribute" },
- { BASE, "Base" },
- { BINARY, "Binary" },
- { TBOOLEAN, "Boolean" },
- { BYREF, "ByRef", },
- { TBYTE, "Byte", },
- { BYVAL, "ByVal", },
- { CALL, "Call" },
- { CASE, "Case" },
- { _CDECL_, "Cdecl" },
- { CLASSMODULE, "ClassModule" },
- { CLOSE, "Close" },
- { COMPARE, "Compare" },
- { COMPATIBLE,"Compatible" },
- { _CONST_, "Const" },
- { TCURRENCY,"Currency" },
- { TDATE, "Date" },
- { DECLARE, "Declare" },
- { DEFBOOL, "DefBool" },
- { DEFCUR, "DefCur" },
- { DEFDATE, "DefDate" },
- { DEFDBL, "DefDbl" },
- { DEFERR, "DefErr" },
- { DEFINT, "DefInt" },
- { DEFLNG, "DefLng" },
- { DEFOBJ, "DefObj" },
- { DEFSNG, "DefSng" },
- { DEFSTR, "DefStr" },
- { DEFVAR, "DefVar" },
- { DIM, "Dim" },
- { DO, "Do" },
- { TDOUBLE, "Double" },
- { EACH, "Each" },
- { ELSE, "Else" },
- { ELSEIF, "ElseIf" },
- { END, "End" },
- { ENDENUM, "End Enum" },
- { ENDFUNC, "End Function" },
- { ENDIF, "End If" },
- { ENDPROPERTY, "End Property" },
- { ENDSELECT,"End Select" },
- { ENDSUB, "End Sub" },
- { ENDTYPE, "End Type" },
- { ENDIF, "EndIf" },
- { ENUM, "Enum" },
- { EQV, "Eqv" },
- { ERASE, "Erase" },
- { _ERROR_, "Error" },
- { EXIT, "Exit" },
- { EXPLICIT, "Explicit" },
- { FOR, "For" },
- { FUNCTION, "Function" },
- { GET, "Get" },
- { GLOBAL, "Global" },
- { GOSUB, "GoSub" },
- { GOTO, "GoTo" },
- { IF, "If" },
- { IMP, "Imp" },
- { IMPLEMENTS, "Implements" },
- { _IN_, "In" },
- { INPUT, "Input" }, // auch INPUT #
- { TINTEGER, "Integer" },
- { IS, "Is" },
- { LET, "Let" },
- { LIB, "Lib" },
- { LIKE, "Like" },
- { LINE, "Line" },
- { LINEINPUT,"Line Input" },
- { LOCAL, "Local" },
- { LOCK, "Lock" },
- { TLONG, "Long" },
- { LOOP, "Loop" },
- { LPRINT, "LPrint" },
- { LSET, "LSet" }, // JSM
- { MOD, "Mod" },
- { NAME, "Name" },
- { NEW, "New" },
- { NEXT, "Next" },
- { NOT, "Not" },
- { TOBJECT, "Object" },
- { ON, "On" },
- { OPEN, "Open" },
- { OPTION, "Option" },
- { _OPTIONAL_, "Optional" },
- { OR, "Or" },
- { OUTPUT, "Output" },
- { PARAMARRAY, "ParamArray" },
- { PRESERVE, "Preserve" },
- { PRINT, "Print" },
- { PRIVATE, "Private" },
- { PROPERTY, "Property" },
- { PUBLIC, "Public" },
- { RANDOM, "Random" },
- { READ, "Read" },
- { REDIM, "ReDim" },
- { REM, "Rem" },
- { RESUME, "Resume" },
- { RETURN, "Return" },
- { RSET, "RSet" }, // JSM
- { SELECT, "Select" },
- { SET, "Set" },
-#ifdef SHARED
-#undef SHARED
-#define tmpSHARED
-#endif
- { SHARED, "Shared" },
-#ifdef tmpSHARED
-#define SHARED
-#undef tmpSHARED
-#endif
- { TSINGLE, "Single" },
- { STATIC, "Static" },
- { STEP, "Step" },
- { STOP, "Stop" },
- { TSTRING, "String" },
- { SUB, "Sub" },
- { STOP, "System" },
- { TEXT, "Text" },
- { THEN, "Then" },
- { TO, "To", },
- { TYPE, "Type" },
- { TYPEOF, "TypeOf" },
- { UNTIL, "Until" },
- { TVARIANT, "Variant" },
- { VBASUPPORT, "VbaSupport" },
- { WEND, "Wend" },
- { WHILE, "While" },
- { WITH, "With" },
- { WITHEVENTS, "WithEvents" },
- { WRITE, "Write" }, // auch WRITE #
- { XOR, "Xor" },
- { NIL, "" }
-};
-
-
-// #i109076
-TokenLabelInfo::TokenLabelInfo( void )
-{
- m_pTokenCanBeLabelTab = new bool[VBASUPPORT+1];
- for( int i = 0 ; i <= VBASUPPORT ; ++i )
- m_pTokenCanBeLabelTab[i] = false;
-
- // Token accepted as label by VBA
- SbiToken eLabelToken[] = { ACCESS, ALIAS, APPEND, BASE, BINARY, CLASSMODULE,
- COMPARE, COMPATIBLE, DEFERR, _ERROR_, EXPLICIT, LIB, LINE, LPRINT, NAME,
- TOBJECT, OUTPUT, PROPERTY, RANDOM, READ, STEP, STOP, TEXT, VBASUPPORT, NIL };
- SbiToken* pTok = eLabelToken;
- SbiToken eTok;
- for( pTok = eLabelToken ; (eTok = *pTok) != NIL ; ++pTok )
- m_pTokenCanBeLabelTab[eTok] = true;
-}
-
-TokenLabelInfo::~TokenLabelInfo()
-{
- delete[] m_pTokenCanBeLabelTab;
-}
-
-
-// Der Konstruktor ermittelt die Laenge der Token-Tabelle.
-
-SbiTokenizer::SbiTokenizer( const ::rtl::OUString& rSrc, StarBASIC* pb )
- : SbiScanner( rSrc, pb )
-{
- pTokTable = aTokTable_Basic;
- TokenTable *tp;
- bEof = bAs = sal_False;
- eCurTok = NIL;
- ePush = NIL;
- bEos = bKeywords = bErrorIsSymbol = sal_True;
- if( !nToken )
- for( nToken = 0, tp = pTokTable; tp->t; nToken++, tp++ ) {}
-}
-
-SbiTokenizer::~SbiTokenizer()
-{
-}
-
-// Wiederablage (Pushback) eines Tokens. (Bis zu 2 Tokens)
-
-void SbiTokenizer::Push( SbiToken t )
-{
- if( ePush != NIL )
- Error( SbERR_INTERNAL_ERROR, "PUSH" );
- else ePush = t;
-}
-
-void SbiTokenizer::Error( SbError code, const char* pMsg )
-{
- aError = String::CreateFromAscii( pMsg );
- Error( code );
-}
-
-void SbiTokenizer::Error( SbError code, String aMsg )
-{
- aError = aMsg;
- Error( code );
-}
-
-void SbiTokenizer::Error( SbError code, SbiToken tok )
-{
- aError = Symbol( tok );
- Error( code );
-}
-
-// Einlesen des naechsten Tokens, ohne dass das Token geschluckt wird
-
-SbiToken SbiTokenizer::Peek()
-{
- if( ePush == NIL )
- {
- sal_uInt16 nOldLine = nLine;
- sal_uInt16 nOldCol1 = nCol1;
- sal_uInt16 nOldCol2 = nCol2;
- ePush = Next();
- nPLine = nLine; nLine = nOldLine;
- nPCol1 = nCol1; nCol1 = nOldCol1;
- nPCol2 = nCol2; nCol2 = nOldCol2;
- }
- return eCurTok = ePush;
-}
-
-// Dies ist fuer die Decompilation.
-// Zahlen und Symbole liefern einen Leerstring zurueck.
-
-const String& SbiTokenizer::Symbol( SbiToken t )
-{
- // Zeichen-Token?
- if( t < FIRSTKWD )
- {
- aSym = (char) t;
- return aSym;
- }
- switch( t )
- {
- case NEG : aSym = '-'; return aSym;
- case EOS : aSym = String::CreateFromAscii( ":/CRLF" ); return aSym;
- case EOLN : aSym = String::CreateFromAscii( "CRLF" ); return aSym;
- default: break;
- }
- TokenTable* tp = pTokTable;
- for( short i = 0; i < nToken; i++, tp++ )
- {
- if( tp->t == t )
- {
- aSym = String::CreateFromAscii( tp->s );
- return aSym;
- }
- }
- const sal_Unicode *p = aSym.GetBuffer();
- if (*p <= ' ') aSym = String::CreateFromAscii( "???" );
- return aSym;
-}
-
-// Einlesen des naechsten Tokens und Ablage desselben
-// Tokens, die nicht in der Token-Tabelle vorkommen, werden
-// direkt als Zeichen zurueckgeliefert.
-// Einige Worte werden gesondert behandelt.
-
-SbiToken SbiTokenizer::Next()
-{
- if (bEof) return EOLN;
- // Schon eines eingelesen?
- if( ePush != NIL )
- {
- eCurTok = ePush;
- ePush = NIL;
- nLine = nPLine;
- nCol1 = nPCol1;
- nCol2 = nPCol2;
- bEos = IsEoln( eCurTok );
- return eCurTok;
- }
- TokenTable *tp;
-
- // Sonst einlesen:
- if( !NextSym() )
- {
- bEof = bEos = sal_True;
- return eCurTok = EOLN;
- }
- // Zeilenende?
- if( aSym.GetBuffer()[0] == '\n' )
- {
- bEos = sal_True; return eCurTok = EOLN;
- }
- bEos = sal_False;
-
- // Zahl?
- if( bNumber )
- return eCurTok = NUMBER;
-
- // String?
- else if( ( eScanType == SbxDATE || eScanType == SbxSTRING ) && !bSymbol )
- return eCurTok = FIXSTRING;
- // Sonderfaelle von Zeichen, die zwischen "Z" und "a" liegen. ICompare()
- // wertet die Position dieser Zeichen unterschiedlich aus.
- else if( aSym.GetBuffer()[0] == '^' )
- return eCurTok = EXPON;
- else if( aSym.GetBuffer()[0] == '\\' )
- return eCurTok = IDIV;
- else
- {
- // Mit Typkennung oder ein Symbol und keine Keyword-Erkennung?
- // Dann kein Token-Test
- if( eScanType != SbxVARIANT
- || ( !bKeywords && bSymbol ) )
- return eCurTok = SYMBOL;
- // Gueltiges Token?
- short lb = 0;
- short ub = nToken-1;
- short delta;
- do
- {
- delta = (ub - lb) >> 1;
- tp = &pTokTable[ lb + delta ];
- StringCompare res = aSym.CompareIgnoreCaseToAscii( tp->s );
- // Gefunden?
- if( res == COMPARE_EQUAL )
- goto special;
- // Groesser? Dann untere Haelfte
- if( res == COMPARE_LESS )
- {
- if ((ub - lb) == 2) ub = lb;
- else ub = ub - delta;
- }
- // Kleiner? Dann obere Haelfte
- else
- {
- if ((ub -lb) == 2) lb = ub;
- else lb = lb + delta;
- }
- } while( delta );
- // Symbol? Wenn nicht >= Token
- sal_Unicode ch = aSym.GetBuffer()[0];
- if( !BasicSimpleCharClass::isAlpha( ch, bCompatible ) && !bSymbol )
- return eCurTok = (SbiToken) (ch & 0x00FF);
- return eCurTok = SYMBOL;
- }
-special:
- // #i92642
- bool bStartOfLine = (eCurTok == NIL || eCurTok == REM || eCurTok == EOLN);
- if( !bStartOfLine && (tp->t == NAME || tp->t == LINE) )
- return eCurTok = SYMBOL;
- else if( tp->t == TEXT )
- return eCurTok = SYMBOL;
-
- // #i92642: Special LINE token handling -> SbiParser::Line()
-
- // END IF, CASE, SUB, DEF, FUNCTION, TYPE, CLASS, WITH
- if( tp->t == END )
- {
- // AB, 15.3.96, Spezialbehandlung fuer END, beim Peek() geht die
- // aktuelle Zeile verloren, daher alles merken und danach restaurieren
- sal_uInt16 nOldLine = nLine;
- sal_uInt16 nOldCol = nCol;
- sal_uInt16 nOldCol1 = nCol1;
- sal_uInt16 nOldCol2 = nCol2;
- String aOldSym = aSym;
- SaveLine(); // pLine im Scanner sichern
-
- eCurTok = Peek();
- switch( eCurTok )
- {
- case IF: Next(); eCurTok = ENDIF; break;
- case SELECT: Next(); eCurTok = ENDSELECT; break;
- case SUB: Next(); eCurTok = ENDSUB; break;
- case FUNCTION: Next(); eCurTok = ENDFUNC; break;
- case PROPERTY: Next(); eCurTok = ENDPROPERTY; break;
- case TYPE: Next(); eCurTok = ENDTYPE; break;
- case ENUM: Next(); eCurTok = ENDENUM; break;
- case WITH: Next(); eCurTok = ENDWITH; break;
- default : eCurTok = END;
- }
- nCol1 = nOldCol1;
- if( eCurTok == END )
- {
- // Alles zuruecksetzen, damit Token nach END ganz neu gelesen wird
- ePush = NIL;
- nLine = nOldLine;
- nCol = nOldCol;
- nCol2 = nOldCol2;
- aSym = aOldSym;
- RestoreLine(); // pLine im Scanner restaurieren
- }
- return eCurTok;
- }
- // Sind Datentypen Keywords?
- // Nur nach AS, sonst sind es Symbole!
- // Es gibt ja ERROR(), DATA(), STRING() etc.
- eCurTok = tp->t;
- // AS: Datentypen sind Keywords
- if( tp->t == AS )
- bAs = sal_True;
- else
- {
- if( bAs )
- bAs = sal_False;
- else if( eCurTok >= DATATYPE1 && eCurTok <= DATATYPE2 && (bErrorIsSymbol || eCurTok != _ERROR_) )
- eCurTok = SYMBOL;
- }
-
- // CLASSMODULE, PROPERTY, GET, ENUM token only visible in compatible mode
- SbiToken eTok = tp->t;
- if( bCompatible )
- {
- // #129904 Suppress system
- if( eTok == STOP && aSym.CompareIgnoreCaseToAscii( "system" ) == COMPARE_EQUAL )
- eCurTok = SYMBOL;
-
- if( eTok == GET && bStartOfLine )
- eCurTok = SYMBOL;
- }
- else
- {
- if( eTok == CLASSMODULE ||
- eTok == IMPLEMENTS ||
- eTok == PARAMARRAY ||
- eTok == ENUM ||
- eTok == PROPERTY ||
- eTok == GET ||
- eTok == TYPEOF )
- {
- eCurTok = SYMBOL;
- }
- }
-
- bEos = IsEoln( eCurTok );
- return eCurTok;
-}
-
-#ifdef _MSC_VER
-#pragma optimize("",off)
-#endif
-
-// Kann das aktuell eingelesene Token ein Label sein?
-
-sal_Bool SbiTokenizer::MayBeLabel( sal_Bool bNeedsColon )
-{
- if( eCurTok == SYMBOL || m_aTokenLabelInfo.canTokenBeLabel( eCurTok ) )
- return bNeedsColon ? DoesColonFollow() : sal_True;
- else
- return sal_Bool( eCurTok == NUMBER
- && eScanType == SbxINTEGER
- && nVal >= 0 );
-}
-
-#ifdef _MSC_VER
-#pragma optimize("",off)
-#endif
-
-
-void SbiTokenizer::Hilite( SbTextPortions& rList )
-{
- bErrors = sal_False;
- bUsedForHilite = sal_True;
- SbiToken eLastTok = NIL;
- for( ;; )
- {
- Next();
- if( IsEof() )
- break;
- SbTextPortion aRes;
- aRes.nLine = nLine;
- aRes.nStart = nCol1;
- aRes.nEnd = nCol2;
- switch( eCurTok )
- {
- case REM:
- aRes.eType = SB_COMMENT; break;
- case SYMBOL:
- aRes.eType = SB_SYMBOL; break;
- case FIXSTRING:
- aRes.eType = SB_STRING; break;
- case NUMBER:
- aRes.eType = SB_NUMBER; break;
- default:
- if( ( eCurTok >= FIRSTKWD && eCurTok <= LASTKWD )
- || (eCurTok >= _CDECL_ ) )
- aRes.eType = SB_KEYWORD;
- else
- aRes.eType = SB_PUNCTUATION;
- }
- // Die Folge xxx.Keyword sollte nicht als Kwd geflagt werden
- if( aRes.eType == SB_KEYWORD
- && ( eLastTok == DOT|| eLastTok == EXCLAM ) )
- aRes.eType = SB_SYMBOL;
- if( eCurTok != EOLN && aRes.nStart <= aRes.nEnd )
- rList.Insert( aRes, rList.Count() );
- if( aRes.eType == SB_COMMENT )
- break;
- eLastTok = eCurTok;
- }
- bUsedForHilite = sal_False;
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */