/**************************************************************
 * 
 * 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
