You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
136 lines
2.6 KiB
136 lines
2.6 KiB
// 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_
|
|
|