// Copyright 2014 The PDFium Authors // 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_FORMCALC_CXFA_FMLEXER_H_ #define XFA_FXFA_FORMCALC_CXFA_FMLEXER_H_ #include "core/fxcrt/widestring.h" #include "v8/include/cppgc/macros.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 }; class CXFA_FMLexer { CPPGC_STACK_ALLOCATED(); // Raw pointers allowed. public: class Token { public: Token(); explicit Token(XFA_FM_TOKEN token); Token(XFA_FM_TOKEN token, WideStringView str); Token(const Token& that); ~Token(); XFA_FM_TOKEN GetType() const { return m_type; } WideStringView GetString() const { return m_string; } #ifndef NDEBUG WideString ToDebugString() const; #endif // NDEBUG private: XFA_FM_TOKEN m_type = TOKreserver; WideStringView m_string; }; explicit CXFA_FMLexer(WideStringView wsFormcalc); ~CXFA_FMLexer(); Token NextToken(); bool IsComplete() const { return m_nCursor >= m_spInput.size(); } private: Token AdvanceForNumber(); Token AdvanceForString(); Token AdvanceForIdentifier(); void AdvanceForComment(); void RaiseError() { m_bLexerError = true; } pdfium::span m_spInput; size_t m_nCursor = 0; bool m_bLexerError = false; }; #endif // XFA_FXFA_FORMCALC_CXFA_FMLEXER_H_