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