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
|
// Copyright 2014 PDFium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
#ifndef _XFA_FM_LEXER_H
#define _XFA_FM_LEXER_H
enum XFA_FM_TOKEN {
TOKand, TOKlparen, TOKrparen, TOKmul, TOKplus, TOKcomma, TOKminus, TOKdot, TOKdiv, TOKlt,
TOKassign, TOKgt, TOKlbracket, TOKrbracket, TOKor, TOKdotscream, TOKdotstar, TOKdotdot,
TOKle, TOKne, TOKeq, TOKge,
TOKdo, TOKkseq, TOKksge, TOKksgt, TOKif, TOKin, TOKksle, TOKkslt, TOKksne, TOKksor, TOKnull,
TOKbreak, TOKksand, TOKend, TOKeof, TOKfor, TOKnan, TOKksnot, TOKvar, TOKthen, TOKelse, TOKexit,
TOKdownto, TOKreturn, TOKinfinity, TOKendwhile, TOKforeach, TOKendfunc, TOKelseif, TOKwhile,
TOKendfor, TOKthrow, TOKstep, TOKupto, TOKcontinue, TOKfunc, TOKendif,
TOKstar,
TOKidentifier, TOKunderscore, TOKdollar, TOKexclamation,
TOKcall,
TOKstring,
TOKnumber,
TOKreserver
};
struct XFA_FMKeyword {
XFA_FM_TOKEN m_type;
uint32_t m_uHash;
const FX_WCHAR* m_keword;
};
const FX_WCHAR* XFA_FM_KeywordToString(XFA_FM_TOKEN op);
class CXFA_FMToken
{
public:
CXFA_FMToken();
CXFA_FMToken(FX_DWORD uLineNum);
~CXFA_FMToken();
CFX_WideStringC m_wstring;
XFA_FM_TOKEN m_type;
FX_DWORD m_uLinenum;
CXFA_FMToken* m_pNext;
};
class CXFA_FMLexer
{
public:
CXFA_FMLexer(const CFX_WideStringC& wsFormcalc, CXFA_FMErrorInfo *pErrorInfo);
~CXFA_FMLexer();
CXFA_FMToken* NextToken();
FX_DWORD Number(CXFA_FMToken *t, const FX_WCHAR* p, const FX_WCHAR* &pEnd);
FX_DWORD String(CXFA_FMToken *t, const FX_WCHAR* p, const FX_WCHAR* &pEnd);
FX_DWORD Identifiers(CXFA_FMToken *t, const FX_WCHAR* p, const FX_WCHAR* &pEnd);
void Comment(const FX_WCHAR* p, const FX_WCHAR* &pEnd);
XFA_FM_TOKEN IsKeyword(const CFX_WideStringC& p);
void SetCurrentLine(FX_DWORD line)
{
m_uCurrentLine = line;
}
void SetToken(CXFA_FMToken *pToken)
{
if (m_pToken) {
delete m_pToken;
}
m_pToken = pToken;
}
const FX_WCHAR* SavePos()
{
return m_ptr;
}
void RestorePos(const FX_WCHAR* pPos)
{
m_ptr = pPos;
}
void Error(XFA_FM_ERRMSG msg, ...);
FX_BOOL HasError() const;
protected:
CXFA_FMToken* Scan();
const FX_WCHAR* m_pScript;
const FX_WCHAR* m_ptr;
FX_STRSIZE m_uLength;
FX_DWORD m_uCurrentLine;
CXFA_FMToken* m_pToken;
CXFA_FMErrorInfo* m_pErrorInfo;
};
#endif
|