| // 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_FXFA_FM2JS_XFA_LEXER_H_ |
| #define XFA_FXFA_FM2JS_XFA_LEXER_H_ |
| |
| #include <memory> |
| |
| #include "core/fxcrt/fx_string.h" |
| #include "xfa/fxfa/fm2js/xfa_error.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_keyword; |
| }; |
| |
| const FX_WCHAR* XFA_FM_KeywordToString(XFA_FM_TOKEN op); |
| |
| class CXFA_FMToken { |
| public: |
| CXFA_FMToken(); |
| explicit CXFA_FMToken(uint32_t uLineNum); |
| |
| CFX_WideStringC m_wstring; |
| XFA_FM_TOKEN m_type; |
| uint32_t m_uLinenum; |
| }; |
| |
| class CXFA_FMLexer { |
| public: |
| CXFA_FMLexer(const CFX_WideStringC& wsFormcalc, CXFA_FMErrorInfo* pErrorInfo); |
| ~CXFA_FMLexer(); |
| |
| CXFA_FMToken* NextToken(); |
| uint32_t Number(CXFA_FMToken* t, const FX_WCHAR* p, const FX_WCHAR*& pEnd); |
| uint32_t String(CXFA_FMToken* t, const FX_WCHAR* p, const FX_WCHAR*& pEnd); |
| uint32_t 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(uint32_t line) { m_uCurrentLine = line; } |
| void SetToken(CXFA_FMToken* pToken) { |
| if (m_pToken.get() != pToken) |
| m_pToken.reset(pToken); |
| } |
| const FX_WCHAR* SavePos() { return m_ptr; } |
| void RestorePos(const FX_WCHAR* pPos) { m_ptr = pPos; } |
| void Error(const FX_WCHAR* msg, ...); |
| bool HasError() const; |
| |
| protected: |
| CXFA_FMToken* Scan(); |
| |
| const FX_WCHAR* m_ptr; |
| uint32_t m_uCurrentLine; |
| std::unique_ptr<CXFA_FMToken> m_pToken; |
| CXFA_FMErrorInfo* m_pErrorInfo; |
| }; |
| |
| #endif // XFA_FXFA_FM2JS_XFA_LEXER_H_ |