blob: 3ae3f66be8b708bd22d57c8b8ca2a86a4717b7bf (
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
|
/* -*- 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 .
*/
#ifndef INCLUDED_STARMATH_INC_PARSE_HXX
#define INCLUDED_STARMATH_INC_PARSE_HXX
#include <vcl/svapp.hxx>
#include <memory>
#include <set>
#include <vector>
#include "types.hxx"
#include "token.hxx"
#include "error.hxx"
#include "node.hxx"
class SmParser
{
OUString m_aBufferString;
SmToken m_aCurToken;
SmNodeStack m_aNodeStack;
std::vector<std::unique_ptr<SmErrorDesc>> m_aErrDescList;
int m_nCurError;
LanguageType m_nLang;
sal_Int32 m_nBufferIndex,
m_nTokenIndex;
sal_Int32 m_Row,
m_nColOff;
bool bImportSymNames,
m_bExportSymNames;
// map of used symbols (used to reduce file size by exporting only actually used symbols)
std::set< OUString > m_aUsedSymbols;
//! locale where '.' is decimal separator!
css::lang::Locale m_aDotLoc;
SmParser(const SmParser&) = delete;
SmParser& operator=(const SmParser&) = delete;
bool IsDelimiter( const OUString &rTxt, sal_Int32 nPos );
void NextToken();
sal_Int32 GetTokenIndex() const { return m_nTokenIndex; }
void Replace( sal_Int32 nPos, sal_Int32 nLen, const OUString &rText );
inline bool TokenInGroup( sal_uLong nGroup );
// grammar
void DoTable();
void DoLine();
void DoExpression();
void DoRelation();
void DoSum();
void DoProduct();
void DoSubSup(sal_uLong nActiveGroup);
void DoOpSubSup();
void DoPower();
void DoBlank();
void DoTerm(bool bGroupNumberIdent);
void DoEscape();
void DoOperator();
void DoOper();
void DoUnOper();
void DoAlign();
void DoFontAttribut();
void DoAttribut();
void DoFont();
void DoFontSize();
void DoColor();
void DoBrace();
void DoBracebody(bool bIsLeftRight);
void DoFunction();
void DoBinom();
void DoStack();
void DoMatrix();
void DoSpecial();
void DoGlyphSpecial();
// end of grammar
void SetLanguage( LanguageType nNewLang ) { m_nLang = nNewLang; }
void Error(SmParseError Error);
void ClearUsedSymbols() { m_aUsedSymbols.clear(); }
void AddToUsedSymbols( const OUString &rSymbolName ) { m_aUsedSymbols.insert( rSymbolName ); }
public:
SmParser();
/** Parse rBuffer to formula tree */
SmNode *Parse(const OUString &rBuffer);
/** Parse rBuffer to formula subtree that constitutes an expression */
SmNode *ParseExpression(const OUString &rBuffer);
const OUString & GetText() const { return m_aBufferString; };
bool IsImportSymbolNames() const { return bImportSymNames; }
void SetImportSymbolNames(bool bVal) { bImportSymNames = bVal; }
bool IsExportSymbolNames() const { return m_bExportSymNames; }
void SetExportSymbolNames(bool bVal) { m_bExportSymNames = bVal; }
void AddError(SmParseError Type, SmNode *pNode);
const SmErrorDesc* NextError();
const SmErrorDesc* PrevError();
const SmErrorDesc* GetError(size_t i);
static const SmTokenTableEntry* GetTokenTableEntry( const OUString &rName );
std::set< OUString > GetUsedSymbols() const { return m_aUsedSymbols; }
};
inline bool SmParser::TokenInGroup( sal_uLong nGroup)
{
return (m_aCurToken.nGroup & nGroup) != 0;
}
#endif
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|