// 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 #include "xfa/fxfa/formcalc/cxfa_fmparser.h" #include <utility> #include <vector> #include "core/fxcrt/autorestorer.h" #include "v8/include/cppgc/heap.h" namespace { constexpr unsigned int kMaxParseDepth = …; constexpr unsigned int kMaxPostExpressions = …; constexpr unsigned int kMaxExpressionListSize = …; } // namespace CXFA_FMParser::CXFA_FMParser(cppgc::Heap* pHeap, CXFA_FMLexer* pLexer) : … { … } CXFA_FMParser::~CXFA_FMParser() = default; CXFA_FMAST* CXFA_FMParser::Parse() { … } bool CXFA_FMParser::NextToken() { … } bool CXFA_FMParser::CheckThenNext(XFA_FM_TOKEN op) { … } bool CXFA_FMParser::IncrementParseDepthAndCheck() { … } std::vector<cppgc::Member<CXFA_FMExpression>> CXFA_FMParser::ParseExpressionList() { … } // Func := 'func' Identifier '(' ParameterList ')' do ExpressionList 'endfunc' // ParamterList := (Not actually defined in the grammar) ..... // (Identifier (',' Identifier)*)? CXFA_FMExpression* CXFA_FMParser::ParseFunction() { … } // Expression := IfExpression | WhileExpression | ForExpression | // ForEachExpression | AssignmentExpression | // DeclarationExpression | SimpleExpression CXFA_FMExpression* CXFA_FMParser::ParseExpression() { … } // Declaration := 'var' Variable | 'var' Variable '=' SimpleExpression | // 'Func' Identifier '(' ParameterList ')' do ExpressionList 'EndFunc' // TODO(dsinclair): We appear to be handling the 'func' case elsewhere. CXFA_FMExpression* CXFA_FMParser::ParseDeclarationExpression() { … } // SimpleExpression := LogicalOrExpression CXFA_FMSimpleExpression* CXFA_FMParser::ParseSimpleExpression() { … } // Exp := SimpleExpression ( '=' SimpleExpression )? CXFA_FMExpression* CXFA_FMParser::ParseExpExpression() { … } // LogicalOr := LogicalAndExpression | // LogicalOrExpression LogicalOrOperator LogicalAndExpression CXFA_FMSimpleExpression* CXFA_FMParser::ParseLogicalOrExpression() { … } // LogicalAnd := EqualityExpression | // LogicalAndExpression LogicalAndOperator EqualityExpression CXFA_FMSimpleExpression* CXFA_FMParser::ParseLogicalAndExpression() { … } // Equality := RelationExpression | // EqualityExpression EqulaityOperator RelationalExpression CXFA_FMSimpleExpression* CXFA_FMParser::ParseEqualityExpression() { … } // Relational := AdditiveExpression | // RelationalExpression RelationalOperator AdditiveExpression CXFA_FMSimpleExpression* CXFA_FMParser::ParseRelationalExpression() { … } // Additive := MultiplicativeExpression | // AdditiveExpression AdditiveOperator MultiplicativeExpression CXFA_FMSimpleExpression* CXFA_FMParser::ParseAdditiveExpression() { … } // Multiplicative := UnaryExpression | // MultiplicateExpression MultiplicativeOperator UnaryExpression CXFA_FMSimpleExpression* CXFA_FMParser::ParseMultiplicativeExpression() { … } // Unary := PrimaryExpression | UnaryOperator UnaryExpression CXFA_FMSimpleExpression* CXFA_FMParser::ParseUnaryExpression() { … } // Primary := Literal | FunctionCall | Accessor ('.*' )? | // '(' SimpleExpression ')' CXFA_FMSimpleExpression* CXFA_FMParser::ParsePrimaryExpression() { … } // Literal := String | Number | Null CXFA_FMSimpleExpression* CXFA_FMParser::ParseLiteral() { … } // TODO(dsinclair): Make this match up to the grammar // I believe this is parsing the accessor ( '.' | '..' | '.#' ) CXFA_FMSimpleExpression* CXFA_FMParser::ParsePostExpression( CXFA_FMSimpleExpression* expr) { … } // Argument lists are zero or more comma seperated simple expressions found // between '(' and ')' std::optional<std::vector<cppgc::Member<CXFA_FMSimpleExpression>>> CXFA_FMParser::ParseArgumentList() { … } // Index := '[' ('*' | '+' SimpleExpression | '-' SimpleExpression) ']' CXFA_FMSimpleExpression* CXFA_FMParser::ParseIndexExpression() { … } // Paren := '(' SimpleExpression ')' CXFA_FMSimpleExpression* CXFA_FMParser::ParseParenExpression() { … } // If := 'if' '(' SimpleExpression ')' 'then' ExpressionList // ('elseif' '(' SimpleExpression ')' 'then' ExpressionList)* // ('else' ExpressionList)? // 'endif' CXFA_FMExpression* CXFA_FMParser::ParseIfExpression() { … } // While := 'while' '(' SimpleExpression ')' 'do' ExpressionList 'endwhile' CXFA_FMExpression* CXFA_FMParser::ParseWhileExpression() { … } // For := 'for' Assignment 'upto' Accessor ('step' SimpleExpression)? // 'do' ExpressionList 'endfor' | // 'for' Assignment 'downto' Accessor ('step' SimpleExpression)? // 'do' ExpressionList 'endfor' CXFA_FMExpression* CXFA_FMParser::ParseForExpression() { … } // Foreach := 'foreach' Identifier 'in' '(' ArgumentList ')' // 'do' ExpressionList 'endfor' CXFA_FMExpression* CXFA_FMParser::ParseForeachExpression() { … } // Block := 'do' ExpressionList 'end' CXFA_FMExpression* CXFA_FMParser::ParseDoExpression() { … } bool CXFA_FMParser::HasError() const { … }