| // 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 |