1 // Copyright 2014 PDFium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6 
7 #ifndef _XFA_FM_LEXER_H
8 #define _XFA_FM_LEXER_H
9 enum XFA_FM_TOKEN {
10   TOKand,
11   TOKlparen,
12   TOKrparen,
13   TOKmul,
14   TOKplus,
15   TOKcomma,
16   TOKminus,
17   TOKdot,
18   TOKdiv,
19   TOKlt,
20   TOKassign,
21   TOKgt,
22   TOKlbracket,
23   TOKrbracket,
24   TOKor,
25   TOKdotscream,
26   TOKdotstar,
27   TOKdotdot,
28   TOKle,
29   TOKne,
30   TOKeq,
31   TOKge,
32   TOKdo,
33   TOKkseq,
34   TOKksge,
35   TOKksgt,
36   TOKif,
37   TOKin,
38   TOKksle,
39   TOKkslt,
40   TOKksne,
41   TOKksor,
42   TOKnull,
43   TOKbreak,
44   TOKksand,
45   TOKend,
46   TOKeof,
47   TOKfor,
48   TOKnan,
49   TOKksnot,
50   TOKvar,
51   TOKthen,
52   TOKelse,
53   TOKexit,
54   TOKdownto,
55   TOKreturn,
56   TOKinfinity,
57   TOKendwhile,
58   TOKforeach,
59   TOKendfunc,
60   TOKelseif,
61   TOKwhile,
62   TOKendfor,
63   TOKthrow,
64   TOKstep,
65   TOKupto,
66   TOKcontinue,
67   TOKfunc,
68   TOKendif,
69   TOKstar,
70   TOKidentifier,
71   TOKunderscore,
72   TOKdollar,
73   TOKexclamation,
74   TOKcall,
75   TOKstring,
76   TOKnumber,
77   TOKreserver
78 };
79 struct XFA_FMKeyword {
80   XFA_FM_TOKEN m_type;
81   uint32_t m_uHash;
82   const FX_WCHAR* m_keword;
83 };
84 const FX_WCHAR* XFA_FM_KeywordToString(XFA_FM_TOKEN op);
85 class CXFA_FMToken {
86  public:
87   CXFA_FMToken();
88   CXFA_FMToken(FX_DWORD uLineNum);
89   ~CXFA_FMToken();
90   CFX_WideStringC m_wstring;
91   XFA_FM_TOKEN m_type;
92   FX_DWORD m_uLinenum;
93   CXFA_FMToken* m_pNext;
94 };
95 class CXFA_FMLexer {
96  public:
97   CXFA_FMLexer(const CFX_WideStringC& wsFormcalc, CXFA_FMErrorInfo* pErrorInfo);
98   ~CXFA_FMLexer();
99   CXFA_FMToken* NextToken();
100   FX_DWORD Number(CXFA_FMToken* t, const FX_WCHAR* p, const FX_WCHAR*& pEnd);
101   FX_DWORD String(CXFA_FMToken* t, const FX_WCHAR* p, const FX_WCHAR*& pEnd);
102   FX_DWORD Identifiers(CXFA_FMToken* t,
103                        const FX_WCHAR* p,
104                        const FX_WCHAR*& pEnd);
105   void Comment(const FX_WCHAR* p, const FX_WCHAR*& pEnd);
106   XFA_FM_TOKEN IsKeyword(const CFX_WideStringC& p);
SetCurrentLine(FX_DWORD line)107   void SetCurrentLine(FX_DWORD line) { m_uCurrentLine = line; }
SetToken(CXFA_FMToken * pToken)108   void SetToken(CXFA_FMToken* pToken) {
109     if (m_pToken) {
110       delete m_pToken;
111     }
112     m_pToken = pToken;
113   }
SavePos()114   const FX_WCHAR* SavePos() { return m_ptr; }
RestorePos(const FX_WCHAR * pPos)115   void RestorePos(const FX_WCHAR* pPos) { m_ptr = pPos; }
116   void Error(XFA_FM_ERRMSG msg, ...);
117   FX_BOOL HasError() const;
118 
119  protected:
120   CXFA_FMToken* Scan();
121   const FX_WCHAR* m_pScript;
122   const FX_WCHAR* m_ptr;
123   FX_STRSIZE m_uLength;
124   FX_DWORD m_uCurrentLine;
125   CXFA_FMToken* m_pToken;
126   CXFA_FMErrorInfo* m_pErrorInfo;
127 };
128 #endif
129