/**************************************************************
 *
 * 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 _PARSER_HXX
#define _PARSER_HXX

#include "expr.hxx"
#include "codegen.hxx"
#include "symtbl.hxx"


#include <vector>
typedef ::std::vector< String > StringVector;

struct SbiParseStack;

class SbiParser : public SbiTokenizer
{
	friend class SbiExpression;

	SbiParseStack* pStack;   		// Block-Stack
	SbiProcDef* pProc;				// aktuelle Prozedur
	SbiExprNode*  pWithVar;			// aktuelle With-Variable
	SbiToken    eEndTok;   			// das Ende-Token
	sal_uInt32		nGblChain;			// Chainkette fuer globale DIMs
	sal_Bool		bGblDefs; 			// sal_True globale Definitionen allgemein
	sal_Bool		bNewGblDefs; 		// sal_True globale Definitionen vor Sub
	sal_Bool		bSingleLineIf; 		// sal_True einzeiliges if-Statement

	SbiSymDef*  VarDecl( SbiDimList**,sal_Bool,sal_Bool );// Variablen-Deklaration
	SbiProcDef* ProcDecl(sal_Bool bDecl);// Prozedur-Deklaration
	void DefStatic( sal_Bool bPrivate );
	void DefProc( sal_Bool bStatic, sal_Bool bPrivate ); // Prozedur einlesen
	void DefVar( SbiOpcode eOp, sal_Bool bStatic );	// DIM/REDIM einlesen
	void TypeDecl( SbiSymDef&, sal_Bool bAsNewAlreadyParsed=sal_False ); 	// AS-Deklaration
	void OpenBlock( SbiToken, SbiExprNode* = NULL );	// Block oeffnen
	void CloseBlock();				// Block aufloesen
	sal_Bool Channel( sal_Bool=sal_False );		// Kanalnummer parsen
	void StmntBlock( SbiToken ); 	// Statement-Block abarbeiten
	void DefType( sal_Bool bPrivate );	// Parse type declaration
	void DefEnum( sal_Bool bPrivate );	// Parse enum declaration
	void DefDeclare( sal_Bool bPrivate );
	void EnableCompatibility();
public:
	SbxArrayRef	  rTypeArray;		// das Type-Array
	SbxArrayRef	  rEnumArray;		// Enum types
	SbiStringPool aGblStrings;		// der String-Pool
	SbiStringPool aLclStrings;		// der String-Pool
	SbiSymPool    aGlobals;			// globale Variable
	SbiSymPool    aPublics; 	 	// modulglobale Variable
	SbiSymPool    aRtlSyms; 	 	// Runtime-Library
	SbiCodeGen    aGen;	   			// Code-Generator
	StarBASIC*	  pBasic;			// StarBASIC-Instanz
	SbiSymPool*	  pPool; 			// aktueller Pool
	SbiExprType   eCurExpr;	  		// aktueller Expr-Typ
	short		  nBase;			// OPTION BASE-Wert
	sal_Bool		  bText;			// OPTION COMPARE TEXT
	sal_Bool          bExplicit; 		// sal_True: OPTION EXPLICIT
	sal_Bool          bClassModule;		// sal_True: OPTION ClassModule
	StringVector  aIfaceVector;		// Holds all interfaces implemented by a class module
	StringVector  aRequiredTypes;   // Types used in Dim As New <type> outside subs
	SbxDataType   eDefTypes[26];	// DEFxxx-Datentypen

	SbiParser( StarBASIC*, SbModule* );
	sal_Bool Parse();					// die Aktion
	SbiExprNode* GetWithVar();		// Innerste With-Variable liefern

	// AB 31.3.1996, Symbol in Runtime-Library suchen
	SbiSymDef* CheckRTLForSym( const String& rSym, SbxDataType eType );
	void AddConstants( void );

	sal_Bool HasGlobalCode();			// Globaler Code definiert?

	sal_Bool TestToken( SbiToken );		// bestimmtes TOken?
	sal_Bool TestSymbol( sal_Bool=sal_False );	// Symbol?
	sal_Bool TestComma();				// Komma oder EOLN?
	void TestEoln();				// EOLN?

	void Symbol( const KeywordSymbolInfo* pKeywordSymbolInfo = NULL );	// Let oder Call
	void ErrorStmnt(); 				// ERROR n
	void NotImp();					// nicht implementiert
	void BadBlock();				// LOOP/WEND/NEXT
	void BadSyntax();				// Falsches SbiToken
	void NoIf();					// ELSE/ELSE IF ohne IF
	void Assign();					// LET
	void Call();					// CALL
	void Close();					// CLOSE
	void Declare();					// DECLARE
	void DefXXX();					// DEFxxx
	void Dim();						// DIM
	void ReDim();					// ReDim();
	void Erase();					// ERASE
	void Exit();					// EXIT
	void For();						// FOR...NEXT
	void Goto();					// GOTO / GOSUB
	void If();						// IF
	void Implements();				// IMPLEMENTS
	void Input();					// INPUT, INPUT #
	void Line();					// LINE -> LINE INPUT [#] (#i92642)
	void LineInput();				// LINE INPUT, LINE INPUT #
	void LSet();					// LSET
	void Name();					// NAME .. AS ..
	void On();						// ON ERROR/variable
	void OnGoto();					// ON...GOTO / GOSUB
	void Open();					// OPEN
	void Option();					// OPTION
	void Print();					// PRINT, PRINT #
	void SubFunc();					// SUB / FUNCTION
	void Resume();					// RESUME
	void Return();					// RETURN
	void RSet();					// RSET
	void DoLoop();					// DO...LOOP
	void Select();					// SELECT ... CASE
	void Set();						// SET
	void Static();					// STATIC
	void Stop();					// STOP/SYSTEM
	void Type();					// TYPE...AS...END TYPE
	void Enum();					// TYPE...END ENUM
	void While();					// WHILE/WEND
	void With();					// WITH
	void Write();					// WRITE
};






#endif
