2000-09-18 15:18:56 +00:00
|
|
|
/*************************************************************************
|
|
|
|
*
|
2008-04-11 10:53:02 +00:00
|
|
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
2005-09-29 11:53:08 +00:00
|
|
|
*
|
2010-02-12 15:01:35 +01:00
|
|
|
* Copyright 2000, 2010 Oracle and/or its affiliates.
|
2005-09-29 11:53:08 +00:00
|
|
|
*
|
2008-04-11 10:53:02 +00:00
|
|
|
* OpenOffice.org - a multi-platform office productivity suite
|
2000-09-18 15:18:56 +00:00
|
|
|
*
|
2008-04-11 10:53:02 +00:00
|
|
|
* This file is part of OpenOffice.org.
|
2000-09-18 15:18:56 +00:00
|
|
|
*
|
2008-04-11 10:53:02 +00:00
|
|
|
* 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.
|
2000-09-18 15:18:56 +00:00
|
|
|
*
|
2008-04-11 10:53:02 +00:00
|
|
|
* 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).
|
2000-09-18 15:18:56 +00:00
|
|
|
*
|
2008-04-11 10:53:02 +00:00
|
|
|
* 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.
|
2000-09-18 15:18:56 +00:00
|
|
|
*
|
|
|
|
************************************************************************/
|
|
|
|
|
2006-09-17 09:03:55 +00:00
|
|
|
// MARKER(update_precomp.py): autogen include statement, do not remove
|
|
|
|
#include "precompiled_basic.hxx"
|
|
|
|
|
2000-09-18 15:18:56 +00:00
|
|
|
#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" },
|
|
|
|
{ BASE, "Base" },
|
|
|
|
{ BINARY, "Binary" },
|
|
|
|
{ TBOOLEAN, "Boolean" },
|
2004-03-17 12:34:05 +00:00
|
|
|
{ BYREF, "ByRef", },
|
2006-05-05 07:37:55 +00:00
|
|
|
{ TBYTE, "Byte", },
|
2000-09-18 15:18:56 +00:00
|
|
|
{ BYVAL, "ByVal", },
|
|
|
|
{ CALL, "Call" },
|
|
|
|
{ CASE, "Case" },
|
|
|
|
{ _CDECL_, "Cdecl" },
|
2004-11-02 10:55:03 +00:00
|
|
|
{ CLASSMODULE, "ClassModule" },
|
2000-09-18 15:18:56 +00:00
|
|
|
{ CLOSE, "Close" },
|
|
|
|
{ COMPARE, "Compare" },
|
2004-03-17 12:34:05 +00:00
|
|
|
{ COMPATIBLE,"Compatible" },
|
2000-09-18 15:18:56 +00:00
|
|
|
{ _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" },
|
2004-11-15 15:42:14 +00:00
|
|
|
{ ENDENUM, "End Enum" },
|
2000-09-18 15:18:56 +00:00
|
|
|
{ ENDFUNC, "End Function" },
|
|
|
|
{ ENDIF, "End If" },
|
2004-11-02 10:55:03 +00:00
|
|
|
{ ENDPROPERTY, "End Property" },
|
2000-09-18 15:18:56 +00:00
|
|
|
{ ENDSELECT,"End Select" },
|
|
|
|
{ ENDSUB, "End Sub" },
|
|
|
|
{ ENDTYPE, "End Type" },
|
|
|
|
{ ENDIF, "EndIf" },
|
2004-11-15 15:42:14 +00:00
|
|
|
{ ENUM, "Enum" },
|
2000-09-18 15:18:56 +00:00
|
|
|
{ EQV, "Eqv" },
|
|
|
|
{ ERASE, "Erase" },
|
|
|
|
{ _ERROR_, "Error" },
|
|
|
|
{ EXIT, "Exit" },
|
|
|
|
{ EXPLICIT, "Explicit" },
|
|
|
|
{ FOR, "For" },
|
|
|
|
{ FUNCTION, "Function" },
|
2004-11-02 10:55:03 +00:00
|
|
|
{ GET, "Get" },
|
2000-09-18 15:18:56 +00:00
|
|
|
{ GLOBAL, "Global" },
|
|
|
|
{ GOSUB, "GoSub" },
|
|
|
|
{ GOTO, "GoTo" },
|
|
|
|
{ IF, "If" },
|
|
|
|
{ IMP, "Imp" },
|
2005-03-29 10:50:10 +00:00
|
|
|
{ IMPLEMENTS, "Implements" },
|
2000-09-18 15:18:56 +00:00
|
|
|
{ _IN_, "In" },
|
|
|
|
{ INPUT, "Input" }, // auch INPUT #
|
|
|
|
{ TINTEGER, "Integer" },
|
|
|
|
{ IS, "Is" },
|
|
|
|
{ LET, "Let" },
|
|
|
|
{ LIB, "Lib" },
|
2007-08-30 09:00:31 +00:00
|
|
|
{ LIKE, "Like" },
|
2000-09-18 15:18:56 +00:00
|
|
|
{ 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" },
|
2005-01-28 15:07:02 +00:00
|
|
|
{ PARAMARRAY, "ParamArray" },
|
2000-09-18 15:18:56 +00:00
|
|
|
{ PRESERVE, "Preserve" },
|
|
|
|
{ PRINT, "Print" },
|
|
|
|
{ PRIVATE, "Private" },
|
2004-11-02 10:55:03 +00:00
|
|
|
{ PROPERTY, "Property" },
|
2000-09-18 15:18:56 +00:00
|
|
|
{ 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" },
|
2005-03-29 10:50:10 +00:00
|
|
|
{ TYPEOF, "TypeOf" },
|
2000-09-18 15:18:56 +00:00
|
|
|
{ UNTIL, "Until" },
|
|
|
|
{ TVARIANT, "Variant" },
|
2006-05-05 09:11:58 +00:00
|
|
|
{ VBASUPPORT, "VbaSupport" },
|
2000-09-18 15:18:56 +00:00
|
|
|
{ WEND, "Wend" },
|
|
|
|
{ WHILE, "While" },
|
|
|
|
{ WITH, "With" },
|
|
|
|
{ WRITE, "Write" }, // auch WRITE #
|
|
|
|
{ XOR, "Xor" },
|
2006-06-19 16:43:32 +00:00
|
|
|
{ NIL, "" }
|
2000-09-18 15:18:56 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
/*
|
|
|
|
TokenTable aTokTable_Java [] = { // Token-Tabelle:
|
|
|
|
|
|
|
|
{ JS_LOG_NOT, "!" },
|
|
|
|
{ JS_NE, "!=" },
|
|
|
|
{ JS_MOD, "%" },
|
|
|
|
{ JS_ASS_MOD, "%=" },
|
|
|
|
{ JS_BIT_AND, "&" },
|
|
|
|
{ JS_LOG_AND, "&&" },
|
|
|
|
{ JS_ASS_AND, "&=" },
|
|
|
|
{ JS_LPAREN, "(" },
|
|
|
|
{ JS_RPAREN, ")" },
|
|
|
|
{ JS_MUL, "*" },
|
|
|
|
{ JS_ASS_MUL, "*=" },
|
|
|
|
{ JS_PLUS, "+" },
|
|
|
|
{ JS_INC, "++" },
|
|
|
|
{ JS_ASS_PLUS, "+=" },
|
|
|
|
{ JS_COMMA, "," },
|
|
|
|
{ JS_MINUS, "-" },
|
|
|
|
{ JS_DEC, "--" },
|
|
|
|
{ JS_ASS_MINUS, "-=" },
|
|
|
|
{ JS_DIV, "/" },
|
|
|
|
{ JS_ASS_DIV, "/=" },
|
|
|
|
{ JS_COND_SEL, ":" },
|
|
|
|
{ JS_LT, "<" },
|
|
|
|
{ JS_LSHIFT, "<<" },
|
|
|
|
{ JS_ASS_LSHIFT,"<<=" },
|
|
|
|
{ JS_LE, "<=" },
|
|
|
|
{ JS_NE, "<>" },
|
|
|
|
{ JS_ASSIGNMENT,"=" },
|
|
|
|
{ JS_EQ, "==" },
|
|
|
|
{ JS_GT, ">" },
|
|
|
|
{ JS_RSHIFT, ">>" },
|
|
|
|
{ JS_ASS_RSHIFT,">>=" },
|
|
|
|
{ JS_RSHIFT_Z, ">>>" },
|
|
|
|
{ JS_ASS_RSHIFT_Z,">>>=" },
|
|
|
|
{ JS_GE, ">=" },
|
|
|
|
{ JS_COND_QUEST,"?" },
|
|
|
|
{ ACCESS, "Access" },
|
|
|
|
{ ALIAS, "Alias" },
|
|
|
|
{ AND, "And" },
|
|
|
|
{ ANY, "Any" },
|
|
|
|
{ APPEND, "Append" },
|
|
|
|
{ AS, "As" },
|
|
|
|
{ BASE, "Base" },
|
|
|
|
{ BINARY, "Binary" },
|
|
|
|
{ TBOOLEAN, "Boolean" },
|
|
|
|
{ BYVAL, "ByVal", },
|
|
|
|
{ CALL, "Call" },
|
|
|
|
{ CASE, "Case" },
|
|
|
|
{ _CDECL_, "Cdecl" },
|
|
|
|
{ CLOSE, "Close" },
|
|
|
|
{ COMPARE, "Compare" },
|
|
|
|
{ _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" },
|
|
|
|
{ ENDFUNC, "End Function" },
|
|
|
|
{ ENDIF, "End If" },
|
|
|
|
{ ENDSELECT,"End Select" },
|
|
|
|
{ ENDSUB, "End Sub" },
|
|
|
|
{ ENDTYPE, "End Type" },
|
|
|
|
{ ENDIF, "EndIf" },
|
|
|
|
{ EQV, "Eqv" },
|
|
|
|
{ ERASE, "Erase" },
|
|
|
|
{ _ERROR_, "Error" },
|
|
|
|
{ EXIT, "Exit" },
|
|
|
|
{ EXPLICIT, "Explicit" },
|
|
|
|
{ FOR, "For" },
|
|
|
|
{ FUNCTION, "Function" },
|
|
|
|
{ GLOBAL, "Global" },
|
|
|
|
{ GOSUB, "GoSub" },
|
|
|
|
{ GOTO, "GoTo" },
|
|
|
|
{ IF, "If" },
|
|
|
|
{ IMP, "Imp" },
|
|
|
|
{ _IN_, "In" },
|
|
|
|
{ INPUT, "Input" }, // auch INPUT #
|
|
|
|
{ TINTEGER, "Integer" },
|
|
|
|
{ IS, "Is" },
|
|
|
|
{ LET, "Let" },
|
|
|
|
{ LIB, "Lib" },
|
|
|
|
{ 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" },
|
|
|
|
{ PRESERVE, "Preserve" },
|
|
|
|
{ PRINT, "Print" },
|
|
|
|
{ PRIVATE, "Private" },
|
|
|
|
{ PUBLIC, "Public" },
|
|
|
|
{ RANDOM, "Random" },
|
|
|
|
{ READ, "Read" },
|
|
|
|
{ REDIM, "ReDim" },
|
|
|
|
{ REM, "Rem" },
|
|
|
|
{ RESUME, "Resume" },
|
|
|
|
{ RETURN, "Return" },
|
|
|
|
{ RSET, "RSet" }, // JSM
|
|
|
|
{ SELECT, "Select" },
|
|
|
|
{ SET, "Set" },
|
|
|
|
{ SHARED, "Shared" },
|
|
|
|
{ TSINGLE, "Single" },
|
|
|
|
{ STATIC, "Static" },
|
|
|
|
{ STEP, "Step" },
|
|
|
|
{ STOP, "Stop" },
|
|
|
|
{ TSTRING, "String" },
|
|
|
|
{ SUB, "Sub" },
|
|
|
|
{ STOP, "System" },
|
|
|
|
{ TEXT, "Text" },
|
|
|
|
{ THEN, "Then" },
|
|
|
|
{ TO, "To", },
|
|
|
|
{ TYPE, "Type" },
|
|
|
|
{ UNTIL, "Until" },
|
|
|
|
{ TVARIANT, "Variant" },
|
|
|
|
{ WEND, "Wend" },
|
|
|
|
{ WHILE, "While" },
|
|
|
|
{ WITH, "With" },
|
|
|
|
{ WRITE, "Write" }, // auch WRITE #
|
|
|
|
{ XOR, "Xor" },
|
|
|
|
{ JS_LINDEX, "[" },
|
|
|
|
{ JS_RINDEX, "]" },
|
|
|
|
{ JS_BIT_XOR, "^" },
|
|
|
|
{ JS_ASS_XOR, "^=" },
|
|
|
|
{ JS_BIT_OR, "|" },
|
|
|
|
{ JS_ASS_OR, "|=" },
|
|
|
|
{ JS_LOG_OR, "||" },
|
|
|
|
{ JS_BIT_NOT, "~" },
|
|
|
|
{ NIL }
|
|
|
|
};
|
|
|
|
*/
|
|
|
|
|
|
|
|
// Der Konstruktor ermittelt die Laenge der Token-Tabelle.
|
|
|
|
|
2003-04-23 15:57:17 +00:00
|
|
|
SbiTokenizer::SbiTokenizer( const ::rtl::OUString& rSrc, StarBASIC* pb )
|
2000-09-18 15:18:56 +00:00
|
|
|
: SbiScanner( rSrc, pb )
|
|
|
|
{
|
|
|
|
pTokTable = aTokTable_Basic;
|
|
|
|
//if( StarBASIC::GetGlobalLanguageMode() == SB_LANG_JAVASCRIPT )
|
|
|
|
// pTokTable = aTokTable_Java;
|
|
|
|
TokenTable *tp;
|
|
|
|
bEof = bAs = FALSE;
|
|
|
|
eCurTok = NIL;
|
|
|
|
ePush = NIL;
|
2006-05-05 07:48:35 +00:00
|
|
|
bEos = bKeywords = bErrorIsSymbol = TRUE;
|
2000-09-18 15:18:56 +00:00
|
|
|
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 )
|
|
|
|
{
|
|
|
|
USHORT nOldLine = nLine;
|
|
|
|
USHORT nOldCol1 = nCol1;
|
|
|
|
USHORT 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;
|
2006-06-19 16:43:32 +00:00
|
|
|
default: break;
|
2000-09-18 15:18:56 +00:00
|
|
|
}
|
|
|
|
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 = TRUE;
|
|
|
|
return eCurTok = EOLN;
|
|
|
|
}
|
|
|
|
// Zeilenende?
|
|
|
|
if( aSym.GetBuffer()[0] == '\n' )
|
|
|
|
{
|
|
|
|
bEos = TRUE; return eCurTok = EOLN;
|
|
|
|
}
|
|
|
|
bEos = 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;
|
2006-10-12 13:28:11 +00:00
|
|
|
else ub = ub - delta;
|
2000-09-18 15:18:56 +00:00
|
|
|
}
|
|
|
|
// Kleiner? Dann obere Haelfte
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if ((ub -lb) == 2) lb = ub;
|
2006-10-12 13:28:11 +00:00
|
|
|
else lb = lb + delta;
|
2000-09-18 15:18:56 +00:00
|
|
|
}
|
|
|
|
} while( delta );
|
|
|
|
// Symbol? Wenn nicht >= Token
|
|
|
|
sal_Unicode ch = aSym.GetBuffer()[0];
|
2004-03-17 12:34:05 +00:00
|
|
|
if( !BasicSimpleCharClass::isAlpha( ch, bCompatible ) && !bSymbol )
|
2000-09-18 15:18:56 +00:00
|
|
|
return eCurTok = (SbiToken) (ch & 0x00FF);
|
|
|
|
return eCurTok = SYMBOL;
|
|
|
|
}
|
|
|
|
special:
|
|
|
|
// LINE INPUT
|
|
|
|
if( tp->t == LINE )
|
|
|
|
{
|
|
|
|
short nC1 = nCol1;
|
2005-07-08 08:58:47 +00:00
|
|
|
String aOldSym = aSym;
|
2000-09-18 15:18:56 +00:00
|
|
|
eCurTok = Peek();
|
|
|
|
if( eCurTok == INPUT )
|
|
|
|
{
|
|
|
|
Next();
|
|
|
|
nCol1 = nC1;
|
|
|
|
return eCurTok = LINEINPUT;
|
|
|
|
}
|
|
|
|
else
|
2005-07-08 08:58:47 +00:00
|
|
|
{
|
|
|
|
aSym = aOldSym;
|
2000-09-18 15:18:56 +00:00
|
|
|
return eCurTok = LINE;
|
2005-07-08 08:58:47 +00:00
|
|
|
}
|
2000-09-18 15:18:56 +00:00
|
|
|
}
|
|
|
|
// 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
|
|
|
|
USHORT nOldLine = nLine;
|
|
|
|
USHORT nOldCol = nCol;
|
|
|
|
USHORT nOldCol1 = nCol1;
|
|
|
|
USHORT 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;
|
2004-11-02 10:55:03 +00:00
|
|
|
case PROPERTY: Next(); eCurTok = ENDPROPERTY; break;
|
2000-09-18 15:18:56 +00:00
|
|
|
case TYPE: Next(); eCurTok = ENDTYPE; break;
|
2004-11-15 15:42:14 +00:00
|
|
|
case ENUM: Next(); eCurTok = ENDENUM; break;
|
2000-09-18 15:18:56 +00:00
|
|
|
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 = TRUE;
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if( bAs )
|
|
|
|
bAs = FALSE;
|
2006-05-05 07:48:35 +00:00
|
|
|
else if( eCurTok >= DATATYPE1 && eCurTok <= DATATYPE2 && (bErrorIsSymbol || eCurTok != _ERROR_) )
|
2000-09-18 15:18:56 +00:00
|
|
|
eCurTok = SYMBOL;
|
|
|
|
}
|
2004-11-02 10:55:03 +00:00
|
|
|
|
2004-12-10 16:20:26 +00:00
|
|
|
// CLASSMODULE, PROPERTY, GET, ENUM token only visible in compatible mode
|
2006-05-05 07:37:55 +00:00
|
|
|
SbiToken eTok = tp->t;
|
|
|
|
if( bCompatible )
|
|
|
|
{
|
|
|
|
// #129904 Suppress system
|
|
|
|
if( eTok == STOP && aSym.CompareIgnoreCaseToAscii( "system" ) == COMPARE_EQUAL )
|
|
|
|
eCurTok = SYMBOL;
|
|
|
|
}
|
|
|
|
else
|
2004-11-15 15:42:14 +00:00
|
|
|
{
|
2004-12-10 16:20:26 +00:00
|
|
|
if( eTok == CLASSMODULE ||
|
2005-03-29 10:50:10 +00:00
|
|
|
eTok == IMPLEMENTS ||
|
2005-01-28 15:07:02 +00:00
|
|
|
eTok == PARAMARRAY ||
|
2004-12-10 16:20:26 +00:00
|
|
|
eTok == ENUM ||
|
|
|
|
eTok == PROPERTY ||
|
2005-03-29 10:50:10 +00:00
|
|
|
eTok == GET ||
|
|
|
|
eTok == TYPEOF )
|
2004-12-10 16:20:26 +00:00
|
|
|
{
|
2004-11-15 15:42:14 +00:00
|
|
|
eCurTok = SYMBOL;
|
2004-12-10 16:20:26 +00:00
|
|
|
}
|
2004-11-15 15:42:14 +00:00
|
|
|
}
|
2004-11-02 10:55:03 +00:00
|
|
|
|
2000-09-18 15:18:56 +00:00
|
|
|
bEos = IsEoln( eCurTok );
|
|
|
|
return eCurTok;
|
|
|
|
}
|
|
|
|
|
|
|
|
#ifdef _MSC_VER
|
|
|
|
#pragma optimize("",off)
|
|
|
|
#endif
|
|
|
|
|
|
|
|
// Kann das aktuell eingelesene Token ein Label sein?
|
|
|
|
|
|
|
|
BOOL SbiTokenizer::MayBeLabel( BOOL bNeedsColon )
|
|
|
|
{
|
|
|
|
if( eCurTok == SYMBOL )
|
|
|
|
return bNeedsColon ? DoesColonFollow() : TRUE;
|
|
|
|
else
|
|
|
|
return BOOL( eCurTok == NUMBER
|
|
|
|
&& eScanType == SbxINTEGER
|
|
|
|
&& nVal >= 0 );
|
|
|
|
}
|
|
|
|
|
|
|
|
#ifdef _MSC_VER
|
|
|
|
#pragma optimize("",off)
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
void SbiTokenizer::Hilite( SbTextPortions& rList )
|
|
|
|
{
|
|
|
|
bErrors = FALSE;
|
|
|
|
bUsedForHilite = 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 = FALSE;
|
|
|
|
}
|
|
|
|
|