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_FXFA_FM2JS_XFA_LEXER_H_ 8 #define XFA_FXFA_FM2JS_XFA_LEXER_H_ 9 10 #include <memory> 11 12 #include "core/fxcrt/fx_string.h" 13 #include "xfa/fxfa/fm2js/xfa_error.h" 14 15 enum XFA_FM_TOKEN { 16 TOKand, 17 TOKlparen, 18 TOKrparen, 19 TOKmul, 20 TOKplus, 21 TOKcomma, 22 TOKminus, 23 TOKdot, 24 TOKdiv, 25 TOKlt, 26 TOKassign, 27 TOKgt, 28 TOKlbracket, 29 TOKrbracket, 30 TOKor, 31 TOKdotscream, 32 TOKdotstar, 33 TOKdotdot, 34 TOKle, 35 TOKne, 36 TOKeq, 37 TOKge, 38 TOKdo, 39 TOKkseq, 40 TOKksge, 41 TOKksgt, 42 TOKif, 43 TOKin, 44 TOKksle, 45 TOKkslt, 46 TOKksne, 47 TOKksor, 48 TOKnull, 49 TOKbreak, 50 TOKksand, 51 TOKend, 52 TOKeof, 53 TOKfor, 54 TOKnan, 55 TOKksnot, 56 TOKvar, 57 TOKthen, 58 TOKelse, 59 TOKexit, 60 TOKdownto, 61 TOKreturn, 62 TOKinfinity, 63 TOKendwhile, 64 TOKforeach, 65 TOKendfunc, 66 TOKelseif, 67 TOKwhile, 68 TOKendfor, 69 TOKthrow, 70 TOKstep, 71 TOKupto, 72 TOKcontinue, 73 TOKfunc, 74 TOKendif, 75 TOKstar, 76 TOKidentifier, 77 TOKunderscore, 78 TOKdollar, 79 TOKexclamation, 80 TOKcall, 81 TOKstring, 82 TOKnumber, 83 TOKreserver 84 }; 85 86 struct XFA_FMKeyword { 87 XFA_FM_TOKEN m_type; 88 uint32_t m_uHash; 89 const FX_WCHAR* m_keyword; 90 }; 91 92 const FX_WCHAR* XFA_FM_KeywordToString(XFA_FM_TOKEN op); 93 94 class CXFA_FMToken { 95 public: 96 CXFA_FMToken(); 97 explicit CXFA_FMToken(uint32_t uLineNum); 98 99 CFX_WideStringC m_wstring; 100 XFA_FM_TOKEN m_type; 101 uint32_t m_uLinenum; 102 }; 103 104 class CXFA_FMLexer { 105 public: 106 CXFA_FMLexer(const CFX_WideStringC& wsFormcalc, CXFA_FMErrorInfo* pErrorInfo); 107 ~CXFA_FMLexer(); 108 109 CXFA_FMToken* NextToken(); 110 uint32_t Number(CXFA_FMToken* t, const FX_WCHAR* p, const FX_WCHAR*& pEnd); 111 uint32_t String(CXFA_FMToken* t, const FX_WCHAR* p, const FX_WCHAR*& pEnd); 112 uint32_t Identifiers(CXFA_FMToken* t, 113 const FX_WCHAR* p, 114 const FX_WCHAR*& pEnd); 115 void Comment(const FX_WCHAR* p, const FX_WCHAR*& pEnd); 116 XFA_FM_TOKEN IsKeyword(const CFX_WideStringC& p); SetCurrentLine(uint32_t line)117 void SetCurrentLine(uint32_t line) { m_uCurrentLine = line; } SetToken(CXFA_FMToken * pToken)118 void SetToken(CXFA_FMToken* pToken) { 119 if (m_pToken.get() != pToken) 120 m_pToken.reset(pToken); 121 } SavePos()122 const FX_WCHAR* SavePos() { return m_ptr; } RestorePos(const FX_WCHAR * pPos)123 void RestorePos(const FX_WCHAR* pPos) { m_ptr = pPos; } 124 void Error(const FX_WCHAR* msg, ...); 125 bool HasError() const; 126 127 protected: 128 CXFA_FMToken* Scan(); 129 130 const FX_WCHAR* m_ptr; 131 uint32_t m_uCurrentLine; 132 std::unique_ptr<CXFA_FMToken> m_pToken; 133 CXFA_FMErrorInfo* m_pErrorInfo; 134 }; 135 136 #endif // XFA_FXFA_FM2JS_XFA_LEXER_H_ 137