summaryrefslogtreecommitdiffstats
path: root/basic/source/inc/parser.hxx
blob: 4e03e6d39058b7b803b3ddca73af0e9d343d2c60 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
 * This file is part of the LibreOffice project.
 *
 * This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
 *
 * This file incorporates work covered by the following license notice:
 *
 *   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 .
 */

#pragma once

#include "expr.hxx"
#include "codegen.hxx"
#include "symtbl.hxx"
#include <basic/sbx.hxx>

#include <vector>

struct SbiParseStack;

class SbiParser : public SbiTokenizer
{
    friend class SbiExpression;

    SbiParseStack* pStack;
    SbiProcDef* pProc;
    SbiExprNode*  pWithVar;
    SbiToken    eEndTok;
    sal_uInt32      nGblChain;          // for global DIMs
    bool        bGblDefs;           // true: global definitions general
    bool        bNewGblDefs;        // true: globale definitions before sub
    bool        bSingleLineIf;
    bool        bCodeCompleting;

    SbiSymDef*  VarDecl( SbiExprListPtr*, bool, bool );
    SbiProcDef* ProcDecl(bool bDecl);
    void DefStatic( bool bPrivate );
    void DefProc( bool bStatic, bool bPrivate ); // read in procedure
    void DefVar( SbiOpcode eOp, bool bStatic ); // read in DIM/REDIM
    void TypeDecl( SbiSymDef&, bool bAsNewAlreadyParsed=false );    // AS-declaration
    void OpenBlock( SbiToken, SbiExprNode* = nullptr );
    void CloseBlock();
    bool Channel( bool bAlways=false );     // parse channel number
    void StmntBlock( SbiToken );
    void DefType();  // Parse type declaration
    void DefEnum( bool bPrivate );  // Parse enum declaration
    void DefDeclare( bool bPrivate );
    void EnableCompatibility();
    static bool IsUnoInterface( const OUString& sTypeName );
public:
    SbxArrayRef   rTypeArray;
    SbxArrayRef   rEnumArray;
    SbiStringPool aGblStrings;      // string-pool
    SbiStringPool aLclStrings;      // string-pool
    SbiSymPool    aGlobals;
    SbiSymPool    aPublics;         // module global
    SbiSymPool    aRtlSyms;         // Runtime-Library
    SbiCodeGen    aGen;             // Code-Generator
    SbiSymPool*   pPool;
    short         nBase;            // OPTION BASE-value
    bool          bExplicit;        // true: OPTION EXPLICIT
    bool          bClassModule;     // true: OPTION ClassModule
    std::vector<OUString> aIfaceVector;     // Holds all interfaces implemented by a class module
    std::vector<OUString> aRequiredTypes;   // Types used in Dim As New <type> outside subs
#   define N_DEF_TYPES 26
    SbxDataType   eDefTypes[N_DEF_TYPES];    // DEFxxx data types

    SbiParser( StarBASIC*, SbModule* );
    ~SbiParser( );
    bool Parse();
    void SetCodeCompleting( bool b );
    bool IsCodeCompleting() const { return bCodeCompleting;}
    SbiExprNode* GetWithVar();

    // from 31.3.1996, search symbol in the runtime-library
    SbiSymDef* CheckRTLForSym( const OUString& rSym, SbxDataType eType );
    void AddConstants();

    bool HasGlobalCode();

    bool TestToken( SbiToken );
    bool TestSymbol();
    bool TestComma();
    void TestEoln();

    void Symbol( const KeywordSymbolInfo* pKeywordSymbolInfo );  // let or call
    void ErrorStmnt();              // ERROR n
    void BadBlock();                // LOOP/WEND/NEXT
    void NoIf();                    // ELSE/ELSE IF without IF
    void Assign();                  // LET
    void Attribute();
    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
};


/* vim:set shiftwidth=4 softtabstop=4 expandtab: */