blob: 1f02f6032316baa7aa1f92cf040dc9427dfeccfa [file] [log] [blame]
// 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_FMPARSER_H_
#define XFA_FXFA_FORMCALC_CXFA_FMPARSER_H_
#include <vector>
#include "core/fxcrt/unowned_ptr.h"
#include "fxjs/gc/heap.h"
#include "third_party/abseil-cpp/absl/types/optional.h"
#include "v8/include/cppgc/macros.h"
#include "v8/include/cppgc/member.h"
#include "xfa/fxfa/formcalc/cxfa_fmexpression.h"
#include "xfa/fxfa/formcalc/cxfa_fmlexer.h"
class CXFA_FMParser {
CPPGC_STACK_ALLOCATED(); // Allow Raw/Unowned pointers.
public:
CXFA_FMParser(cppgc::Heap* heap, CXFA_FMLexer* pLexer);
~CXFA_FMParser();
// Returned object is owned by cppgc heap.
CXFA_FMAST* Parse();
bool HasError() const;
void SetMaxParseDepthForTest(unsigned long max_depth) {
m_max_parse_depth = max_depth;
}
private:
bool NextToken();
bool CheckThenNext(XFA_FM_TOKEN op);
bool IncrementParseDepthAndCheck();
std::vector<cppgc::Member<CXFA_FMExpression>> ParseExpressionList();
CXFA_FMExpression* ParseFunction();
CXFA_FMExpression* ParseExpression();
CXFA_FMExpression* ParseDeclarationExpression();
CXFA_FMExpression* ParseExpExpression();
CXFA_FMExpression* ParseIfExpression();
CXFA_FMExpression* ParseWhileExpression();
CXFA_FMExpression* ParseForExpression();
CXFA_FMExpression* ParseForeachExpression();
CXFA_FMExpression* ParseDoExpression();
CXFA_FMSimpleExpression* ParseParenExpression();
CXFA_FMSimpleExpression* ParseSimpleExpression();
CXFA_FMSimpleExpression* ParseLogicalOrExpression();
CXFA_FMSimpleExpression* ParseLogicalAndExpression();
CXFA_FMSimpleExpression* ParseEqualityExpression();
CXFA_FMSimpleExpression* ParseRelationalExpression();
CXFA_FMSimpleExpression* ParseAdditiveExpression();
CXFA_FMSimpleExpression* ParseMultiplicativeExpression();
CXFA_FMSimpleExpression* ParseUnaryExpression();
CXFA_FMSimpleExpression* ParsePrimaryExpression();
CXFA_FMSimpleExpression* ParsePostExpression(CXFA_FMSimpleExpression* e);
CXFA_FMSimpleExpression* ParseIndexExpression();
CXFA_FMSimpleExpression* ParseLiteral();
absl::optional<std::vector<cppgc::Member<CXFA_FMSimpleExpression>>>
ParseArgumentList();
UnownedPtr<cppgc::Heap> const m_heap;
UnownedPtr<CXFA_FMLexer> m_lexer;
CXFA_FMLexer::Token m_token;
bool m_error = false;
unsigned long m_parse_depth = 0;
unsigned long m_max_parse_depth;
};
#endif // XFA_FXFA_FORMCALC_CXFA_FMPARSER_H_