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.
306 lines
9.5 KiB
306 lines
9.5 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_SIMPLEEXPRESSION_H_ |
|
#define XFA_FXFA_FM2JS_XFA_SIMPLEEXPRESSION_H_ |
|
|
|
#include <memory> |
|
#include <vector> |
|
|
|
#include "core/fxcrt/fx_basic.h" |
|
#include "xfa/fxfa/fm2js/xfa_lexer.h" |
|
|
|
#define RUNTIMEFUNCTIONRETURNVALUE \ |
|
(L"foxit_xfa_formcalc_runtime_func_return_value") |
|
#define EXCLAMATION_IN_IDENTIFIER (L"foxit_xfa_formcalc__exclamation__") |
|
|
|
enum XFA_FM_SimpleExpressionType { |
|
ASSIGN, |
|
LOGICALOR, |
|
LOGICALAND, |
|
EQUALITY, |
|
NOTEQUALITY, |
|
LESS, |
|
LESSEQUAL, |
|
GREATER, |
|
GREATEREQUAL, |
|
PLUS, |
|
MINUS, |
|
MULTIPLE, |
|
DIVIDE, |
|
POSITIVE, |
|
NEGATIVE, |
|
NOT, |
|
CALL, |
|
DOT, |
|
DOTDOT, |
|
CONCATFMOBJECT, |
|
ISFMOBJECT, |
|
ISFMARRAY, |
|
GETFMVALUE, |
|
GETFMJSOBJ, |
|
VARFILTER |
|
}; |
|
|
|
CFX_WideStringC XFA_FM_EXPTypeToString( |
|
XFA_FM_SimpleExpressionType simpleExpType); |
|
|
|
enum XFA_FM_AccessorIndex { |
|
ACCESSOR_NO_INDEX, |
|
ACCESSOR_NO_RELATIVEINDEX, |
|
ACCESSOR_POSITIVE_INDEX, |
|
ACCESSOR_NEGATIVE_INDEX |
|
}; |
|
|
|
class CXFA_FMSimpleExpression { |
|
public: |
|
CXFA_FMSimpleExpression(uint32_t line, XFA_FM_TOKEN op); |
|
virtual ~CXFA_FMSimpleExpression() {} |
|
virtual void ToJavaScript(CFX_WideTextBuf& javascript); |
|
virtual void ToImpliedReturnJS(CFX_WideTextBuf& javascript); |
|
|
|
XFA_FM_TOKEN GetOperatorToken() const; |
|
|
|
protected: |
|
uint32_t m_line; |
|
XFA_FM_TOKEN m_op; |
|
}; |
|
|
|
class CXFA_FMNullExpression : public CXFA_FMSimpleExpression { |
|
public: |
|
explicit CXFA_FMNullExpression(uint32_t line); |
|
~CXFA_FMNullExpression() override {} |
|
void ToJavaScript(CFX_WideTextBuf& javascript) override; |
|
}; |
|
|
|
class CXFA_FMNumberExpression : public CXFA_FMSimpleExpression { |
|
public: |
|
CXFA_FMNumberExpression(uint32_t line, CFX_WideStringC wsNumber); |
|
~CXFA_FMNumberExpression() override; |
|
void ToJavaScript(CFX_WideTextBuf& javascript) override; |
|
|
|
private: |
|
CFX_WideStringC m_wsNumber; |
|
}; |
|
|
|
class CXFA_FMStringExpression : public CXFA_FMSimpleExpression { |
|
public: |
|
CXFA_FMStringExpression(uint32_t line, CFX_WideStringC wsString); |
|
~CXFA_FMStringExpression() override; |
|
void ToJavaScript(CFX_WideTextBuf& javascript) override; |
|
|
|
private: |
|
CFX_WideStringC m_wsString; |
|
}; |
|
|
|
class CXFA_FMIdentifierExpression : public CXFA_FMSimpleExpression { |
|
public: |
|
CXFA_FMIdentifierExpression(uint32_t line, CFX_WideStringC wsIdentifier); |
|
~CXFA_FMIdentifierExpression() override; |
|
void ToJavaScript(CFX_WideTextBuf& javascript) override; |
|
|
|
private: |
|
CFX_WideStringC m_wsIdentifier; |
|
}; |
|
|
|
class CXFA_FMUnaryExpression : public CXFA_FMSimpleExpression { |
|
public: |
|
CXFA_FMUnaryExpression(uint32_t line, |
|
XFA_FM_TOKEN op, |
|
std::unique_ptr<CXFA_FMSimpleExpression> pExp); |
|
~CXFA_FMUnaryExpression() override; |
|
|
|
void ToJavaScript(CFX_WideTextBuf& javascript) override; |
|
|
|
protected: |
|
std::unique_ptr<CXFA_FMSimpleExpression> m_pExp; |
|
}; |
|
|
|
class CXFA_FMBinExpression : public CXFA_FMSimpleExpression { |
|
public: |
|
CXFA_FMBinExpression(uint32_t line, |
|
XFA_FM_TOKEN op, |
|
std::unique_ptr<CXFA_FMSimpleExpression> pExp1, |
|
std::unique_ptr<CXFA_FMSimpleExpression> pExp2); |
|
~CXFA_FMBinExpression() override; |
|
|
|
void ToJavaScript(CFX_WideTextBuf& javascript) override; |
|
|
|
protected: |
|
std::unique_ptr<CXFA_FMSimpleExpression> m_pExp1; |
|
std::unique_ptr<CXFA_FMSimpleExpression> m_pExp2; |
|
}; |
|
|
|
class CXFA_FMAssignExpression : public CXFA_FMBinExpression { |
|
public: |
|
CXFA_FMAssignExpression(uint32_t line, |
|
XFA_FM_TOKEN op, |
|
std::unique_ptr<CXFA_FMSimpleExpression> pExp1, |
|
std::unique_ptr<CXFA_FMSimpleExpression> pExp2); |
|
~CXFA_FMAssignExpression() override {} |
|
void ToJavaScript(CFX_WideTextBuf& javascript) override; |
|
void ToImpliedReturnJS(CFX_WideTextBuf& javascript) override; |
|
}; |
|
|
|
class CXFA_FMLogicalOrExpression : public CXFA_FMBinExpression { |
|
public: |
|
CXFA_FMLogicalOrExpression(uint32_t line, |
|
XFA_FM_TOKEN op, |
|
std::unique_ptr<CXFA_FMSimpleExpression> pExp1, |
|
std::unique_ptr<CXFA_FMSimpleExpression> pExp2); |
|
~CXFA_FMLogicalOrExpression() override {} |
|
void ToJavaScript(CFX_WideTextBuf& javascript) override; |
|
}; |
|
|
|
class CXFA_FMLogicalAndExpression : public CXFA_FMBinExpression { |
|
public: |
|
CXFA_FMLogicalAndExpression(uint32_t line, |
|
XFA_FM_TOKEN op, |
|
std::unique_ptr<CXFA_FMSimpleExpression> pExp1, |
|
std::unique_ptr<CXFA_FMSimpleExpression> pExp2); |
|
~CXFA_FMLogicalAndExpression() override {} |
|
void ToJavaScript(CFX_WideTextBuf& javascript) override; |
|
}; |
|
|
|
class CXFA_FMEqualityExpression : public CXFA_FMBinExpression { |
|
public: |
|
CXFA_FMEqualityExpression(uint32_t line, |
|
XFA_FM_TOKEN op, |
|
std::unique_ptr<CXFA_FMSimpleExpression> pExp1, |
|
std::unique_ptr<CXFA_FMSimpleExpression> pExp2); |
|
~CXFA_FMEqualityExpression() override {} |
|
void ToJavaScript(CFX_WideTextBuf& javascript) override; |
|
}; |
|
|
|
class CXFA_FMRelationalExpression : public CXFA_FMBinExpression { |
|
public: |
|
CXFA_FMRelationalExpression(uint32_t line, |
|
XFA_FM_TOKEN op, |
|
std::unique_ptr<CXFA_FMSimpleExpression> pExp1, |
|
std::unique_ptr<CXFA_FMSimpleExpression> pExp2); |
|
~CXFA_FMRelationalExpression() override {} |
|
void ToJavaScript(CFX_WideTextBuf& javascript) override; |
|
}; |
|
|
|
class CXFA_FMAdditiveExpression : public CXFA_FMBinExpression { |
|
public: |
|
CXFA_FMAdditiveExpression(uint32_t line, |
|
XFA_FM_TOKEN op, |
|
std::unique_ptr<CXFA_FMSimpleExpression> pExp1, |
|
std::unique_ptr<CXFA_FMSimpleExpression> pExp2); |
|
~CXFA_FMAdditiveExpression() override {} |
|
void ToJavaScript(CFX_WideTextBuf& javascript) override; |
|
}; |
|
|
|
class CXFA_FMMultiplicativeExpression : public CXFA_FMBinExpression { |
|
public: |
|
CXFA_FMMultiplicativeExpression( |
|
uint32_t line, |
|
XFA_FM_TOKEN op, |
|
std::unique_ptr<CXFA_FMSimpleExpression> pExp1, |
|
std::unique_ptr<CXFA_FMSimpleExpression> pExp2); |
|
~CXFA_FMMultiplicativeExpression() override {} |
|
void ToJavaScript(CFX_WideTextBuf& javascript) override; |
|
}; |
|
|
|
class CXFA_FMPosExpression : public CXFA_FMUnaryExpression { |
|
public: |
|
CXFA_FMPosExpression(uint32_t line, |
|
std::unique_ptr<CXFA_FMSimpleExpression> pExp); |
|
~CXFA_FMPosExpression() override {} |
|
void ToJavaScript(CFX_WideTextBuf& javascript) override; |
|
}; |
|
|
|
class CXFA_FMNegExpression : public CXFA_FMUnaryExpression { |
|
public: |
|
CXFA_FMNegExpression(uint32_t line, |
|
std::unique_ptr<CXFA_FMSimpleExpression> pExp); |
|
~CXFA_FMNegExpression() override {} |
|
void ToJavaScript(CFX_WideTextBuf& javascript) override; |
|
}; |
|
|
|
class CXFA_FMNotExpression : public CXFA_FMUnaryExpression { |
|
public: |
|
CXFA_FMNotExpression(uint32_t line, |
|
std::unique_ptr<CXFA_FMSimpleExpression> pExp); |
|
~CXFA_FMNotExpression() override {} |
|
void ToJavaScript(CFX_WideTextBuf& javascript) override; |
|
}; |
|
|
|
class CXFA_FMCallExpression : public CXFA_FMUnaryExpression { |
|
public: |
|
CXFA_FMCallExpression( |
|
uint32_t line, |
|
std::unique_ptr<CXFA_FMSimpleExpression> pExp, |
|
std::vector<std::unique_ptr<CXFA_FMSimpleExpression>>&& pArguments, |
|
bool bIsSomMethod); |
|
~CXFA_FMCallExpression() override; |
|
|
|
bool IsBuildInFunc(CFX_WideTextBuf* funcName); |
|
uint32_t IsMethodWithObjParam(const CFX_WideStringC& methodName); |
|
void ToJavaScript(CFX_WideTextBuf& javascript) override; |
|
|
|
private: |
|
bool m_bIsSomMethod; |
|
std::vector<std::unique_ptr<CXFA_FMSimpleExpression>> m_Arguments; |
|
}; |
|
|
|
class CXFA_FMDotAccessorExpression : public CXFA_FMBinExpression { |
|
public: |
|
CXFA_FMDotAccessorExpression( |
|
uint32_t line, |
|
std::unique_ptr<CXFA_FMSimpleExpression> pAccessor, |
|
XFA_FM_TOKEN op, |
|
CFX_WideStringC wsIdentifier, |
|
std::unique_ptr<CXFA_FMSimpleExpression> pIndexExp); |
|
~CXFA_FMDotAccessorExpression() override; |
|
void ToJavaScript(CFX_WideTextBuf& javascript) override; |
|
|
|
private: |
|
CFX_WideStringC m_wsIdentifier; |
|
}; |
|
|
|
class CXFA_FMIndexExpression : public CXFA_FMUnaryExpression { |
|
public: |
|
CXFA_FMIndexExpression(uint32_t line, |
|
XFA_FM_AccessorIndex accessorIndex, |
|
std::unique_ptr<CXFA_FMSimpleExpression> pIndexExp, |
|
bool bIsStarIndex); |
|
~CXFA_FMIndexExpression() override {} |
|
void ToJavaScript(CFX_WideTextBuf& javascript) override; |
|
|
|
private: |
|
XFA_FM_AccessorIndex m_accessorIndex; |
|
bool m_bIsStarIndex; |
|
}; |
|
|
|
class CXFA_FMDotDotAccessorExpression : public CXFA_FMBinExpression { |
|
public: |
|
CXFA_FMDotDotAccessorExpression( |
|
uint32_t line, |
|
std::unique_ptr<CXFA_FMSimpleExpression> pAccessor, |
|
XFA_FM_TOKEN op, |
|
CFX_WideStringC wsIdentifier, |
|
std::unique_ptr<CXFA_FMSimpleExpression> pIndexExp); |
|
~CXFA_FMDotDotAccessorExpression() override; |
|
|
|
void ToJavaScript(CFX_WideTextBuf& javascript) override; |
|
|
|
private: |
|
CFX_WideStringC m_wsIdentifier; |
|
}; |
|
|
|
class CXFA_FMMethodCallExpression : public CXFA_FMBinExpression { |
|
public: |
|
CXFA_FMMethodCallExpression( |
|
uint32_t line, |
|
std::unique_ptr<CXFA_FMSimpleExpression> pAccessorExp1, |
|
std::unique_ptr<CXFA_FMSimpleExpression> pCallExp); |
|
~CXFA_FMMethodCallExpression() override {} |
|
void ToJavaScript(CFX_WideTextBuf& javascript) override; |
|
}; |
|
|
|
#endif // XFA_FXFA_FM2JS_XFA_SIMPLEEXPRESSION_H_
|
|
|