Index: xfa/src/fxfa/src/fm2js/xfa_fmparse.cpp |
diff --git a/xfa/src/fxfa/src/fm2js/xfa_fmparse.cpp b/xfa/src/fxfa/src/fm2js/xfa_fmparse.cpp |
index 0a04aae137c0fccc3bd4ab7a883bf7d1940166d9..9a01267e2794e6babf64cce9bc74dfc41302bf4b 100644 |
--- a/xfa/src/fxfa/src/fm2js/xfa_fmparse.cpp |
+++ b/xfa/src/fxfa/src/fm2js/xfa_fmparse.cpp |
@@ -1,1152 +1,1152 @@ |
-// 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 |
- |
-#include "xfa_fm2js.h" |
-CXFA_FMParse::CXFA_FMParse() { |
- m_pScript = 0; |
- m_uLength = 0; |
- m_pErrorInfo = 0; |
- m_lexer = 0; |
- m_pToken = 0; |
-} |
-CXFA_FMParse::~CXFA_FMParse() { |
- if (m_lexer) { |
- delete m_lexer; |
- } |
- m_lexer = 0; |
- m_pErrorInfo = 0; |
- m_pScript = 0; |
- m_pToken = 0; |
-} |
-int32_t CXFA_FMParse::Init(const CFX_WideStringC& wsFormcalc, |
- CXFA_FMErrorInfo* pErrorInfo) { |
- m_pScript = wsFormcalc.GetPtr(); |
- m_uLength = wsFormcalc.GetLength(); |
- m_pErrorInfo = pErrorInfo; |
- m_lexer = new CXFA_FMLexer(wsFormcalc, m_pErrorInfo); |
- if (m_lexer == 0) { |
- return -1; |
- } |
- return 0; |
-} |
-void CXFA_FMParse::NextToken() { |
- m_pToken = m_lexer->NextToken(); |
- while (m_pToken->m_type == TOKreserver) { |
- if (m_lexer->HasError()) { |
- break; |
- } |
- m_pToken = m_lexer->NextToken(); |
- } |
-} |
-void CXFA_FMParse::Check(XFA_FM_TOKEN op) { |
- if (m_pToken->m_type != op) { |
- CFX_WideString ws_TempString = m_pToken->m_wstring; |
- Error(m_pToken->m_uLinenum, FMERR_EXPECTED_TOKEN, |
- XFA_FM_KeywordToString(op), ws_TempString.c_str()); |
- } |
- NextToken(); |
-} |
-void CXFA_FMParse::Error(FX_DWORD lineNum, XFA_FM_ERRMSG msg, ...) { |
- m_pErrorInfo->linenum = lineNum; |
- const FX_WCHAR* lpMessageInfo = XFA_FM_ErrorMsg(msg); |
- va_list ap; |
- va_start(ap, msg); |
- m_pErrorInfo->message.FormatV(lpMessageInfo, ap); |
- va_end(ap); |
-} |
-CFX_PtrArray* CXFA_FMParse::ParseTopExpression() { |
- CXFA_FMExpression* e = 0; |
- CFX_PtrArray* expression = new CFX_PtrArray(); |
- while (1) { |
- if (m_pToken->m_type == TOKeof) { |
- return expression; |
- } |
- if (m_pToken->m_type == TOKendfunc) { |
- return expression; |
- } |
- if (m_pToken->m_type == TOKendif) { |
- return expression; |
- } |
- if (m_pToken->m_type == TOKelseif) { |
- return expression; |
- } |
- if (m_pToken->m_type == TOKelse) { |
- return expression; |
- } |
- if (m_pToken->m_type == TOKfunc) { |
- e = ParseFunction(); |
- if (e) { |
- expression->Add(e); |
- } else { |
- break; |
- } |
- } else { |
- e = ParseExpression(); |
- if (e) { |
- expression->Add(e); |
- } else { |
- break; |
- } |
- } |
- } |
- return expression; |
-} |
-CXFA_FMExpression* CXFA_FMParse::ParseFunction() { |
- CXFA_FMExpression* e = 0; |
- CFX_WideStringC ident; |
- CFX_WideStringCArray* pArguments = 0; |
- CFX_PtrArray* pExpressions = 0; |
- FX_DWORD line = m_pToken->m_uLinenum; |
- NextToken(); |
- if (m_pToken->m_type != TOKidentifier) { |
- CFX_WideString ws_TempString = m_pToken->m_wstring; |
- Error(m_pToken->m_uLinenum, FMERR_EXPECTED_IDENTIFIER, |
- ws_TempString.c_str()); |
- } else { |
- ident = m_pToken->m_wstring; |
- NextToken(); |
- } |
- Check(TOKlparen); |
- if (m_pToken->m_type == TOKrparen) { |
- NextToken(); |
- } else { |
- pArguments = new CFX_WideStringCArray(); |
- CFX_WideStringC p; |
- while (1) { |
- if (m_pToken->m_type == TOKidentifier) { |
- p = m_pToken->m_wstring; |
- pArguments->Add(p); |
- NextToken(); |
- if (m_pToken->m_type == TOKcomma) { |
- NextToken(); |
- continue; |
- } else if (m_pToken->m_type == TOKrparen) { |
- NextToken(); |
- break; |
- } else { |
- Check(TOKrparen); |
- break; |
- } |
- } else { |
- CFX_WideString ws_TempString = m_pToken->m_wstring; |
- Error(m_pToken->m_uLinenum, FMERR_EXPECTED_IDENTIFIER, |
- ws_TempString.c_str()); |
- NextToken(); |
- break; |
- } |
- } |
- } |
- Check(TOKdo); |
- if (m_pToken->m_type == TOKendfunc) { |
- NextToken(); |
- } else { |
- pExpressions = ParseTopExpression(); |
- Check(TOKendfunc); |
- } |
- if (m_pErrorInfo->message.IsEmpty()) { |
- e = new CXFA_FMFunctionDefinition(line, 0, ident, pArguments, pExpressions); |
- } else { |
- int32_t size = 0; |
- int32_t index = 0; |
- if (pArguments) { |
- pArguments->RemoveAll(); |
- delete pArguments; |
- pArguments = 0; |
- } |
- index = 0; |
- if (pExpressions) { |
- CXFA_FMExpression* e1 = 0; |
- size = pExpressions->GetSize(); |
- while (index < size) { |
- e1 = (CXFA_FMExpression*)pExpressions->GetAt(index); |
- delete e1; |
- index++; |
- } |
- pExpressions->RemoveAll(); |
- delete pExpressions; |
- pExpressions = 0; |
- } |
- } |
- return e; |
-} |
-CXFA_FMExpression* CXFA_FMParse::ParseExpression() { |
- CXFA_FMExpression* e = 0; |
- FX_DWORD line = m_pToken->m_uLinenum; |
- switch (m_pToken->m_type) { |
- case TOKvar: |
- e = ParseVarExpression(); |
- break; |
- case TOKnull: |
- case TOKnumber: |
- case TOKstring: |
- case TOKplus: |
- case TOKminus: |
- case TOKksnot: |
- case TOKidentifier: |
- case TOKlparen: |
- e = ParseExpExpression(); |
- break; |
- case TOKif: |
- e = ParseIfExpression(); |
- break; |
- case TOKwhile: |
- e = ParseWhileExpression(); |
- break; |
- case TOKfor: |
- e = ParseForExpression(); |
- break; |
- case TOKforeach: |
- e = ParseForeachExpression(); |
- break; |
- case TOKdo: |
- e = ParseDoExpression(); |
- break; |
- case TOKbreak: |
- e = new CXFA_FMBreakExpression(line); |
- NextToken(); |
- break; |
- case TOKcontinue: |
- e = new CXFA_FMContinueExpression(line); |
- NextToken(); |
- break; |
- default: |
- CFX_WideString ws_TempString = m_pToken->m_wstring; |
- Error(m_pToken->m_uLinenum, FMERR_UNEXPECTED_EXPRESSION, |
- ws_TempString.c_str()); |
- NextToken(); |
- break; |
- } |
- return e; |
-} |
-CXFA_FMExpression* CXFA_FMParse::ParseVarExpression() { |
- CXFA_FMExpression* e = 0; |
- CFX_WideStringC ident; |
- FX_DWORD line = m_pToken->m_uLinenum; |
- NextToken(); |
- if (m_pToken->m_type != TOKidentifier) { |
- CFX_WideString ws_TempString = m_pToken->m_wstring; |
- Error(m_pToken->m_uLinenum, FMERR_EXPECTED_IDENTIFIER, |
- ws_TempString.c_str()); |
- } else { |
- ident = m_pToken->m_wstring; |
- NextToken(); |
- } |
- if (m_pToken->m_type == TOKassign) { |
- NextToken(); |
- e = ParseExpExpression(); |
- } |
- if (m_pErrorInfo->message.IsEmpty()) { |
- e = new CXFA_FMVarExpression(line, ident, e); |
- } else { |
- delete e; |
- e = 0; |
- } |
- return e; |
-} |
-CXFA_FMSimpleExpression* CXFA_FMParse::ParseSimpleExpression() { |
- FX_DWORD line = m_pToken->m_uLinenum; |
- CXFA_FMSimpleExpression *pExp1 = 0, *pExp2 = 0; |
- pExp1 = ParseLogicalOrExpression(); |
- while (m_pToken->m_type == TOKassign) { |
- NextToken(); |
- pExp2 = ParseLogicalOrExpression(); |
- if (m_pErrorInfo->message.IsEmpty()) { |
- pExp1 = new CXFA_FMAssignExpression(line, TOKassign, pExp1, pExp2); |
- } else { |
- delete pExp1; |
- pExp1 = 0; |
- } |
- } |
- return pExp1; |
-} |
-CXFA_FMExpression* CXFA_FMParse::ParseExpExpression() { |
- CXFA_FMExpression* e = 0; |
- FX_DWORD line = m_pToken->m_uLinenum; |
- CXFA_FMSimpleExpression* pExp1 = 0; |
- pExp1 = ParseSimpleExpression(); |
- if (m_pErrorInfo->message.IsEmpty()) { |
- e = new CXFA_FMExpExpression(line, pExp1); |
- } else { |
- delete pExp1; |
- e = 0; |
- } |
- return e; |
-} |
-CXFA_FMSimpleExpression* CXFA_FMParse::ParseLogicalOrExpression() { |
- CXFA_FMSimpleExpression *e1 = 0, *e2 = 0; |
- FX_DWORD line = m_pToken->m_uLinenum; |
- e1 = ParseLogicalAndExpression(); |
- for (;;) { |
- switch (m_pToken->m_type) { |
- case TOKor: |
- case TOKksor: |
- NextToken(); |
- e2 = ParseLogicalAndExpression(); |
- if (m_pErrorInfo->message.IsEmpty()) { |
- e1 = new CXFA_FMLogicalOrExpression(line, TOKor, e1, e2); |
- } else { |
- delete e1; |
- e1 = 0; |
- } |
- continue; |
- default: |
- break; |
- } |
- break; |
- } |
- return e1; |
-} |
-CXFA_FMSimpleExpression* CXFA_FMParse::ParseLogicalAndExpression() { |
- CXFA_FMSimpleExpression *e1 = 0, *e2 = 0; |
- FX_DWORD line = m_pToken->m_uLinenum; |
- e1 = ParseEqualityExpression(); |
- for (;;) { |
- switch (m_pToken->m_type) { |
- case TOKand: |
- case TOKksand: |
- NextToken(); |
- e2 = ParseEqualityExpression(); |
- if (m_pErrorInfo->message.IsEmpty()) { |
- e1 = new CXFA_FMLogicalAndExpression(line, TOKand, e1, e2); |
- } else { |
- delete e1; |
- e1 = 0; |
- } |
- continue; |
- default: |
- break; |
- } |
- break; |
- } |
- return e1; |
-} |
-CXFA_FMSimpleExpression* CXFA_FMParse::ParseEqualityExpression() { |
- CXFA_FMSimpleExpression *e1 = 0, *e2 = 0; |
- FX_DWORD line = m_pToken->m_uLinenum; |
- e1 = ParseRelationalExpression(); |
- for (;;) { |
- switch (m_pToken->m_type) { |
- case TOKeq: |
- case TOKkseq: |
- NextToken(); |
- e2 = ParseRelationalExpression(); |
- if (m_pErrorInfo->message.IsEmpty()) { |
- e1 = new CXFA_FMEqualityExpression(line, TOKeq, e1, e2); |
- } else { |
- delete e1; |
- e1 = 0; |
- } |
- continue; |
- case TOKne: |
- case TOKksne: |
- NextToken(); |
- e2 = ParseRelationalExpression(); |
- if (m_pErrorInfo->message.IsEmpty()) { |
- e1 = new CXFA_FMEqualityExpression(line, TOKne, e1, e2); |
- } else { |
- delete e1; |
- e1 = 0; |
- } |
- continue; |
- default: |
- break; |
- } |
- break; |
- } |
- return e1; |
-} |
-CXFA_FMSimpleExpression* CXFA_FMParse::ParseRelationalExpression() { |
- CXFA_FMSimpleExpression *e1 = 0, *e2 = 0; |
- FX_DWORD line = m_pToken->m_uLinenum; |
- e1 = ParseAddtiveExpression(); |
- for (;;) { |
- switch (m_pToken->m_type) { |
- case TOKlt: |
- case TOKkslt: |
- NextToken(); |
- e2 = ParseAddtiveExpression(); |
- if (m_pErrorInfo->message.IsEmpty()) { |
- e1 = new CXFA_FMRelationalExpression(line, TOKlt, e1, e2); |
- } else { |
- delete e1; |
- e1 = 0; |
- } |
- continue; |
- case TOKgt: |
- case TOKksgt: |
- NextToken(); |
- e2 = ParseAddtiveExpression(); |
- if (m_pErrorInfo->message.IsEmpty()) { |
- e1 = new CXFA_FMRelationalExpression(line, TOKgt, e1, e2); |
- } else { |
- delete e1; |
- e1 = 0; |
- } |
- continue; |
- case TOKle: |
- case TOKksle: |
- NextToken(); |
- e2 = ParseAddtiveExpression(); |
- if (m_pErrorInfo->message.IsEmpty()) { |
- e1 = new CXFA_FMRelationalExpression(line, TOKle, e1, e2); |
- } else { |
- delete e1; |
- e1 = 0; |
- } |
- continue; |
- case TOKge: |
- case TOKksge: |
- NextToken(); |
- e2 = ParseAddtiveExpression(); |
- if (m_pErrorInfo->message.IsEmpty()) { |
- e1 = new CXFA_FMRelationalExpression(line, TOKge, e1, e2); |
- } else { |
- delete e1; |
- e1 = 0; |
- } |
- continue; |
- default: |
- break; |
- } |
- break; |
- } |
- return e1; |
-} |
-CXFA_FMSimpleExpression* CXFA_FMParse::ParseAddtiveExpression() { |
- CXFA_FMSimpleExpression *e1 = 0, *e2 = 0; |
- FX_DWORD line = m_pToken->m_uLinenum; |
- e1 = ParseMultiplicativeExpression(); |
- for (;;) { |
- switch (m_pToken->m_type) { |
- case TOKplus: |
- NextToken(); |
- e2 = ParseMultiplicativeExpression(); |
- if (m_pErrorInfo->message.IsEmpty()) { |
- e1 = new CXFA_FMAdditiveExpression(line, TOKplus, e1, e2); |
- } else { |
- delete e1; |
- e1 = 0; |
- } |
- continue; |
- case TOKminus: |
- NextToken(); |
- e2 = ParseMultiplicativeExpression(); |
- if (m_pErrorInfo->message.IsEmpty()) { |
- e1 = new CXFA_FMAdditiveExpression(line, TOKminus, e1, e2); |
- } else { |
- delete e1; |
- e1 = 0; |
- } |
- continue; |
- default: |
- break; |
- } |
- break; |
- } |
- return e1; |
-} |
-CXFA_FMSimpleExpression* CXFA_FMParse::ParseMultiplicativeExpression() { |
- CXFA_FMSimpleExpression *e1 = 0, *e2 = 0; |
- FX_DWORD line = m_pToken->m_uLinenum; |
- e1 = ParseUnaryExpression(); |
- for (;;) { |
- switch (m_pToken->m_type) { |
- case TOKmul: |
- NextToken(); |
- e2 = ParseUnaryExpression(); |
- if (m_pErrorInfo->message.IsEmpty()) { |
- e1 = new CXFA_FMMultiplicativeExpression(line, TOKmul, e1, e2); |
- } else { |
- delete e1; |
- e1 = 0; |
- } |
- continue; |
- case TOKdiv: |
- NextToken(); |
- e2 = ParseUnaryExpression(); |
- if (m_pErrorInfo->message.IsEmpty()) { |
- e1 = new CXFA_FMMultiplicativeExpression(line, TOKdiv, e1, e2); |
- } else { |
- delete e1; |
- e1 = 0; |
- } |
- continue; |
- default: |
- break; |
- } |
- break; |
- } |
- return e1; |
-} |
-CXFA_FMSimpleExpression* CXFA_FMParse::ParseUnaryExpression() { |
- CXFA_FMSimpleExpression* e = 0; |
- FX_DWORD line = m_pToken->m_uLinenum; |
- switch (m_pToken->m_type) { |
- case TOKplus: |
- NextToken(); |
- e = ParseUnaryExpression(); |
- if (m_pErrorInfo->message.IsEmpty()) { |
- e = new CXFA_FMPosExpression(line, e); |
- } else { |
- e = 0; |
- } |
- break; |
- case TOKminus: |
- NextToken(); |
- e = ParseUnaryExpression(); |
- if (m_pErrorInfo->message.IsEmpty()) { |
- e = new CXFA_FMNegExpression(line, e); |
- } else { |
- e = 0; |
- } |
- break; |
- case TOKksnot: |
- NextToken(); |
- e = ParseUnaryExpression(); |
- if (m_pErrorInfo->message.IsEmpty()) { |
- e = new CXFA_FMNotExpression(line, e); |
- } else { |
- e = 0; |
- } |
- break; |
- default: |
- e = ParsePrimaryExpression(); |
- break; |
- } |
- return e; |
-} |
-CXFA_FMSimpleExpression* CXFA_FMParse::ParsePrimaryExpression() { |
- CXFA_FMSimpleExpression* e = 0; |
- FX_DWORD line = m_pToken->m_uLinenum; |
- switch (m_pToken->m_type) { |
- case TOKnumber: |
- e = new CXFA_FMNumberExpression(line, m_pToken->m_wstring); |
- NextToken(); |
- break; |
- case TOKstring: |
- e = new CXFA_FMStringExpression(line, m_pToken->m_wstring); |
- NextToken(); |
- break; |
- case TOKidentifier: { |
- CFX_WideStringC wsIdentifier(m_pToken->m_wstring); |
- NextToken(); |
- if (m_pToken->m_type == TOKlbracket) { |
- CXFA_FMSimpleExpression* s = ParseIndexExpression(); |
- if (s) { |
- e = new CXFA_FMDotAccessorExpression(line, NULL, TOKdot, wsIdentifier, |
- s); |
- } |
- NextToken(); |
- } else { |
- e = new CXFA_FMIdentifierExpressionn(line, wsIdentifier); |
- } |
- } break; |
- case TOKif: |
- e = new CXFA_FMIdentifierExpressionn(line, m_pToken->m_wstring); |
- NextToken(); |
- break; |
- case TOKnull: |
- e = new CXFA_FMNullExpression(line); |
- NextToken(); |
- break; |
- case TOKlparen: |
- e = ParseParenExpression(); |
- break; |
- default: |
- CFX_WideString ws_TempString = m_pToken->m_wstring; |
- Error(m_pToken->m_uLinenum, FMERR_UNEXPECTED_EXPRESSION, |
- ws_TempString.c_str()); |
- NextToken(); |
- break; |
- } |
- e = ParsePostExpression(e); |
- if (!(m_pErrorInfo->message.IsEmpty())) { |
- delete e; |
- e = 0; |
- } |
- return e; |
-} |
-CXFA_FMSimpleExpression* CXFA_FMParse::ParsePostExpression( |
- CXFA_FMSimpleExpression* e) { |
- FX_DWORD line = m_pToken->m_uLinenum; |
- while (1) { |
- switch (m_pToken->m_type) { |
- case TOKlparen: { |
- NextToken(); |
- CFX_PtrArray* pArray = 0; |
- if (m_pToken->m_type != TOKrparen) { |
- pArray = new CFX_PtrArray(); |
- while (m_pToken->m_type != TOKrparen) { |
- CXFA_FMSimpleExpression* e = ParseSimpleExpression(); |
- if (e) { |
- pArray->Add(e); |
- } |
- if (m_pToken->m_type == TOKcomma) { |
- NextToken(); |
- } else if (m_pToken->m_type == TOKeof) { |
- break; |
- } |
- } |
- if (m_pToken->m_type != TOKrparen) { |
- CFX_WideString ws_TempString = m_pToken->m_wstring; |
- Error(m_pToken->m_uLinenum, FMERR_EXPECTED_TOKEN, |
- XFA_FM_KeywordToString(TOKrparen), ws_TempString.c_str()); |
- } |
- } |
- if (m_pErrorInfo->message.IsEmpty()) { |
- e = new CXFA_FMCallExpression(line, e, pArray, FALSE); |
- NextToken(); |
- if (m_pToken->m_type != TOKlbracket) { |
- continue; |
- } |
- CXFA_FMSimpleExpression* s = ParseIndexExpression(); |
- if (s) { |
- e = new CXFA_FMDotAccessorExpression(line, e, TOKcall, |
- FX_WSTRC(L""), s); |
- } else { |
- delete e; |
- e = 0; |
- } |
- } else { |
- int32_t iSize = pArray->GetSize(); |
- for (int32_t i = 0; i < iSize; ++i) { |
- CXFA_FMSimpleExpression* pTemp = |
- (CXFA_FMSimpleExpression*)pArray->GetAt(i); |
- delete pTemp; |
- } |
- delete pArray; |
- delete e; |
- e = 0; |
- } |
- } break; |
- case TOKdot: |
- NextToken(); |
- if (m_pToken->m_type == TOKidentifier) { |
- CFX_WideStringC tempStr = m_pToken->m_wstring; |
- FX_DWORD tempLine = m_pToken->m_uLinenum; |
- NextToken(); |
- if (m_pToken->m_type == TOKlparen) { |
- CXFA_FMSimpleExpression* pExpAccessor; |
- CXFA_FMSimpleExpression* pExpCall; |
- pExpAccessor = e; |
- NextToken(); |
- CFX_PtrArray* pArray = 0; |
- if (m_pToken->m_type != TOKrparen) { |
- pArray = new CFX_PtrArray(); |
- while (m_pToken->m_type != TOKrparen) { |
- CXFA_FMSimpleExpression* exp = ParseSimpleExpression(); |
- pArray->Add(exp); |
- if (m_pToken->m_type == TOKcomma) { |
- NextToken(); |
- } else if (m_pToken->m_type == TOKeof) { |
- break; |
- } |
- } |
- if (m_pToken->m_type != TOKrparen) { |
- CFX_WideString ws_TempString = m_pToken->m_wstring; |
- Error(m_pToken->m_uLinenum, FMERR_EXPECTED_TOKEN, |
- XFA_FM_KeywordToString(TOKrparen), ws_TempString.c_str()); |
- } |
- } |
- if (m_pErrorInfo->message.IsEmpty()) { |
- CXFA_FMSimpleExpression* pIdentifier = |
- new CXFA_FMIdentifierExpressionn(tempLine, tempStr); |
- pExpCall = |
- new CXFA_FMCallExpression(line, pIdentifier, pArray, TRUE); |
- e = new CXFA_FMMethodCallExpression(line, pExpAccessor, pExpCall); |
- NextToken(); |
- if (m_pToken->m_type != TOKlbracket) { |
- continue; |
- } |
- CXFA_FMSimpleExpression* s = ParseIndexExpression(); |
- if (s) { |
- e = new CXFA_FMDotAccessorExpression(line, e, TOKcall, |
- FX_WSTRC(L""), s); |
- } else { |
- delete e; |
- e = 0; |
- } |
- } else { |
- int32_t iSize = pArray->GetSize(); |
- for (int32_t i = 0; i < iSize; ++i) { |
- CXFA_FMSimpleExpression* pTemp = |
- (CXFA_FMSimpleExpression*)pArray->GetAt(i); |
- delete pTemp; |
- } |
- delete pArray; |
- delete e; |
- e = 0; |
- } |
- } else if (m_pToken->m_type == TOKlbracket) { |
- CXFA_FMSimpleExpression* s = ParseIndexExpression(); |
- if (!(m_pErrorInfo->message.IsEmpty())) { |
- if (s) { |
- delete s; |
- s = 0; |
- } |
- if (e) { |
- delete e; |
- e = 0; |
- } |
- return e; |
- } |
- e = new CXFA_FMDotAccessorExpression(tempLine, e, TOKdot, tempStr, |
- s); |
- } else { |
- CXFA_FMSimpleExpression* s = new CXFA_FMIndexExpression( |
- tempLine, ACCESSOR_NO_INDEX, NULL, FALSE); |
- e = new CXFA_FMDotAccessorExpression(line, e, TOKdot, tempStr, s); |
- continue; |
- } |
- } else { |
- CFX_WideString ws_TempString = m_pToken->m_wstring; |
- Error(m_pToken->m_uLinenum, FMERR_EXPECTED_IDENTIFIER, |
- ws_TempString.c_str()); |
- return e; |
- } |
- break; |
- case TOKdotdot: |
- NextToken(); |
- if (m_pToken->m_type == TOKidentifier) { |
- CFX_WideStringC tempStr = m_pToken->m_wstring; |
- FX_DWORD tempLine = m_pToken->m_uLinenum; |
- NextToken(); |
- if (m_pToken->m_type == TOKlbracket) { |
- CXFA_FMSimpleExpression* s = ParseIndexExpression(); |
- if (!(m_pErrorInfo->message.IsEmpty())) { |
- if (s) { |
- delete s; |
- s = 0; |
- } |
- if (e) { |
- delete e; |
- e = 0; |
- } |
- return e; |
- } |
- e = new CXFA_FMDotDotAccessorExpression(tempLine, e, TOKdotdot, |
- tempStr, s); |
- } else { |
- CXFA_FMSimpleExpression* s = new CXFA_FMIndexExpression( |
- tempLine, ACCESSOR_NO_INDEX, NULL, FALSE); |
- e = new CXFA_FMDotDotAccessorExpression(line, e, TOKdotdot, tempStr, |
- s); |
- continue; |
- } |
- } else { |
- CFX_WideString ws_TempString = m_pToken->m_wstring; |
- Error(m_pToken->m_uLinenum, FMERR_EXPECTED_IDENTIFIER, |
- ws_TempString.c_str()); |
- return e; |
- } |
- break; |
- case TOKdotscream: |
- NextToken(); |
- if (m_pToken->m_type == TOKidentifier) { |
- CFX_WideStringC tempStr = m_pToken->m_wstring; |
- FX_DWORD tempLine = m_pToken->m_uLinenum; |
- NextToken(); |
- if (m_pToken->m_type == TOKlbracket) { |
- CXFA_FMSimpleExpression* s = ParseIndexExpression(); |
- if (!(m_pErrorInfo->message.IsEmpty())) { |
- if (s) { |
- delete s; |
- s = 0; |
- } |
- if (e) { |
- delete e; |
- e = 0; |
- } |
- return e; |
- } |
- e = new CXFA_FMDotAccessorExpression(tempLine, e, TOKdotscream, |
- tempStr, s); |
- } else { |
- CXFA_FMSimpleExpression* s = new CXFA_FMIndexExpression( |
- tempLine, ACCESSOR_NO_INDEX, NULL, FALSE); |
- e = new CXFA_FMDotAccessorExpression(line, e, TOKdotscream, tempStr, |
- s); |
- continue; |
- } |
- } else { |
- CFX_WideString ws_TempString = m_pToken->m_wstring; |
- Error(m_pToken->m_uLinenum, FMERR_EXPECTED_IDENTIFIER, |
- ws_TempString.c_str()); |
- return e; |
- } |
- break; |
- case TOKdotstar: { |
- CXFA_FMSimpleExpression* s = |
- new CXFA_FMIndexExpression(line, ACCESSOR_NO_INDEX, NULL, FALSE); |
- e = new CXFA_FMDotAccessorExpression(line, e, TOKdotstar, |
- FX_WSTRC(L"*"), s); |
- } break; |
- default: |
- return e; |
- } |
- NextToken(); |
- } |
- return e; |
-} |
-CXFA_FMSimpleExpression* CXFA_FMParse::ParseIndexExpression() { |
- CXFA_FMSimpleExpression* pExp = 0; |
- FX_DWORD line = m_pToken->m_uLinenum; |
- NextToken(); |
- CXFA_FMSimpleExpression* s = 0; |
- XFA_FM_AccessorIndex accessorIndex = ACCESSOR_NO_RELATIVEINDEX; |
- if (m_pToken->m_type == TOKmul) { |
- pExp = new CXFA_FMIndexExpression(line, accessorIndex, s, TRUE); |
- NextToken(); |
- if (m_pToken->m_type != TOKrbracket) { |
- CFX_WideString ws_TempString = m_pToken->m_wstring; |
- Error(m_pToken->m_uLinenum, FMERR_EXPECTED_TOKEN, |
- XFA_FM_KeywordToString(TOKrparen), ws_TempString.c_str()); |
- if (pExp) { |
- delete pExp; |
- pExp = 0; |
- } |
- } |
- return pExp; |
- } |
- if (m_pToken->m_type == TOKplus) { |
- accessorIndex = ACCESSOR_POSITIVE_INDEX; |
- NextToken(); |
- } else if (m_pToken->m_type == TOKminus) { |
- accessorIndex = ACCESSOR_NEGATIVE_INDEX; |
- NextToken(); |
- } |
- s = ParseSimpleExpression(); |
- if (m_pToken->m_type != TOKrbracket) { |
- CFX_WideString ws_TempString = m_pToken->m_wstring; |
- Error(m_pToken->m_uLinenum, FMERR_EXPECTED_TOKEN, |
- XFA_FM_KeywordToString(TOKrparen), ws_TempString.c_str()); |
- if (s) { |
- delete s; |
- } |
- } else { |
- pExp = new CXFA_FMIndexExpression(line, accessorIndex, s, FALSE); |
- } |
- return pExp; |
-} |
-CXFA_FMSimpleExpression* CXFA_FMParse::ParseParenExpression() { |
- CXFA_FMSimpleExpression *pExp1 = 0, *pExp2 = 0; |
- FX_DWORD line = m_pToken->m_uLinenum; |
- Check(TOKlparen); |
- if (m_pToken->m_type != TOKrparen) { |
- pExp1 = ParseLogicalOrExpression(); |
- while (m_pToken->m_type == TOKassign) { |
- NextToken(); |
- pExp2 = ParseLogicalOrExpression(); |
- if (m_pErrorInfo->message.IsEmpty()) { |
- pExp1 = new CXFA_FMAssignExpression(line, TOKassign, pExp1, pExp2); |
- } else { |
- delete pExp1; |
- pExp1 = 0; |
- } |
- } |
- Check(TOKrparen); |
- } else { |
- NextToken(); |
- } |
- return pExp1; |
-} |
-CXFA_FMExpression* CXFA_FMParse::ParseBlockExpression() { |
- FX_DWORD line = m_pToken->m_uLinenum; |
- CXFA_FMExpression* e = 0; |
- CFX_PtrArray* expression = new CFX_PtrArray(); |
- while (1) { |
- switch (m_pToken->m_type) { |
- case TOKeof: |
- case TOKendif: |
- case TOKelseif: |
- case TOKelse: |
- case TOKendwhile: |
- case TOKendfor: |
- case TOKend: |
- case TOKendfunc: |
- break; |
- case TOKfunc: |
- e = ParseFunction(); |
- if (e) { |
- expression->Add(e); |
- } |
- continue; |
- default: |
- e = ParseExpression(); |
- if (e) { |
- expression->Add(e); |
- } |
- continue; |
- } |
- break; |
- } |
- CXFA_FMBlockExpression* pExp = 0; |
- if (m_pErrorInfo->message.IsEmpty()) { |
- pExp = new CXFA_FMBlockExpression(line, expression); |
- } else { |
- int32_t size = expression->GetSize(); |
- int32_t index = 0; |
- while (index < size) { |
- e = (CXFA_FMExpression*)expression->GetAt(index); |
- delete e; |
- index++; |
- } |
- expression->RemoveAll(); |
- delete expression; |
- expression = 0; |
- } |
- return pExp; |
-} |
-CXFA_FMExpression* CXFA_FMParse::ParseIfExpression() { |
- CXFA_FMSimpleExpression* pExpression = 0; |
- CXFA_FMExpression* pIfExpression = 0; |
- CXFA_FMExpression* pElseExpression = 0; |
- FX_DWORD line = m_pToken->m_uLinenum; |
- const FX_WCHAR* pStartPos = m_lexer->SavePos(); |
- NextToken(); |
- Check(TOKlparen); |
- while (m_pToken->m_type != TOKrparen) { |
- if (pExpression) { |
- delete pExpression; |
- } |
- pExpression = ParseSimpleExpression(); |
- if (m_pToken->m_type == TOKcomma) { |
- NextToken(); |
- } else { |
- break; |
- } |
- } |
- Check(TOKrparen); |
- if (m_pToken->m_type != TOKthen) { |
- if (pExpression) { |
- delete pExpression; |
- } |
- m_lexer->SetCurrentLine(line); |
- m_pToken = new CXFA_FMToken(line); |
- m_pToken->m_type = TOKidentifier; |
- m_pToken->m_wstring = FX_WSTRC(L"if"); |
- m_lexer->SetToken(m_pToken); |
- m_lexer->RestorePos(pStartPos); |
- return ParseExpExpression(); |
- } |
- Check(TOKthen); |
- pIfExpression = ParseBlockExpression(); |
- switch (m_pToken->m_type) { |
- case TOKeof: |
- case TOKendif: |
- Check(TOKendif); |
- break; |
- case TOKif: |
- pElseExpression = ParseIfExpression(); |
- Check(TOKendif); |
- break; |
- case TOKelseif: |
- pElseExpression = ParseIfExpression(); |
- break; |
- case TOKelse: |
- NextToken(); |
- pElseExpression = ParseBlockExpression(); |
- Check(TOKendif); |
- break; |
- default: |
- CFX_WideString ws_TempString = m_pToken->m_wstring; |
- Error(m_pToken->m_uLinenum, FMERR_EXPECTED_IFEND, ws_TempString.c_str()); |
- NextToken(); |
- break; |
- } |
- CXFA_FMIfExpression* pExp = 0; |
- if (m_pErrorInfo->message.IsEmpty()) { |
- pExp = new CXFA_FMIfExpression(line, pExpression, pIfExpression, |
- pElseExpression); |
- } else { |
- if (pExpression) { |
- delete pExpression; |
- } |
- if (pIfExpression) { |
- delete pIfExpression; |
- } |
- if (pElseExpression) { |
- delete pElseExpression; |
- } |
- } |
- return pExp; |
-} |
-CXFA_FMExpression* CXFA_FMParse::ParseWhileExpression() { |
- CXFA_FMExpression* e = 0; |
- CXFA_FMSimpleExpression* pCondition = 0; |
- CXFA_FMExpression* pExpression = 0; |
- FX_DWORD line = m_pToken->m_uLinenum; |
- NextToken(); |
- pCondition = ParseParenExpression(); |
- Check(TOKdo); |
- pExpression = ParseBlockExpression(); |
- Check(TOKendwhile); |
- if (!m_pErrorInfo->message.IsEmpty()) { |
- if (pCondition) { |
- delete pCondition; |
- } |
- if (pExpression) { |
- delete pExpression; |
- } |
- delete e; |
- e = 0; |
- } else { |
- e = new CXFA_FMWhileExpression(line, pCondition, pExpression); |
- } |
- return e; |
-} |
-CXFA_FMSimpleExpression* CXFA_FMParse::ParseSubassignmentInForExpression() { |
- CXFA_FMSimpleExpression* e = 0; |
- switch (m_pToken->m_type) { |
- case TOKidentifier: |
- e = ParseSimpleExpression(); |
- break; |
- default: |
- CFX_WideString ws_TempString = m_pToken->m_wstring; |
- Error(m_pToken->m_uLinenum, FMERR_UNEXPECTED_EXPRESSION, |
- ws_TempString.c_str()); |
- NextToken(); |
- break; |
- } |
- return e; |
-} |
-CXFA_FMExpression* CXFA_FMParse::ParseForExpression() { |
- CXFA_FMExpression* e = 0; |
- CFX_WideStringC wsVariant; |
- CXFA_FMSimpleExpression* pAssignment = 0; |
- CXFA_FMSimpleExpression* pAccessor = 0; |
- CXFA_FMSimpleExpression* pStep = 0; |
- CXFA_FMExpression* pList = 0; |
- FX_DWORD line = m_pToken->m_uLinenum; |
- NextToken(); |
- if (m_pToken->m_type != TOKidentifier) { |
- CFX_WideString ws_TempString = m_pToken->m_wstring; |
- Error(m_pToken->m_uLinenum, FMERR_EXPECTED_TOKEN, |
- XFA_FM_KeywordToString(m_pToken->m_type), ws_TempString.c_str()); |
- } |
- wsVariant = m_pToken->m_wstring; |
- NextToken(); |
- if (m_pToken->m_type == TOKassign) { |
- NextToken(); |
- pAssignment = ParseSimpleExpression(); |
- } else { |
- CFX_WideString ws_TempString = m_pToken->m_wstring; |
- Error(m_pToken->m_uLinenum, FMERR_EXPECTED_TOKEN, |
- XFA_FM_KeywordToString(m_pToken->m_type), ws_TempString.c_str()); |
- } |
- int32_t iDirection = 0; |
- if (m_pToken->m_type == TOKupto) { |
- iDirection = 1; |
- } else if (m_pToken->m_type == TOKdownto) { |
- iDirection = -1; |
- } else { |
- CFX_WideString ws_TempString = m_pToken->m_wstring; |
- Error(m_pToken->m_uLinenum, FMERR_EXPECTED_TOKEN, L"upto or downto", |
- (const FX_WCHAR*)ws_TempString); |
- } |
- NextToken(); |
- pAccessor = ParseSimpleExpression(); |
- if (m_pToken->m_type == TOKstep) { |
- NextToken(); |
- pStep = ParseSimpleExpression(); |
- } |
- Check(TOKdo); |
- pList = ParseBlockExpression(); |
- Check(TOKendfor); |
- if (m_pErrorInfo->message.IsEmpty()) { |
- e = new CXFA_FMForExpression(line, wsVariant, pAssignment, pAccessor, |
- iDirection, pStep, pList); |
- } else { |
- if (pAssignment) { |
- delete pAssignment; |
- } |
- if (pAccessor) { |
- delete pAccessor; |
- } |
- if (pStep) { |
- delete pStep; |
- } |
- if (pList) { |
- delete pList; |
- } |
- } |
- return e; |
-} |
-CXFA_FMExpression* CXFA_FMParse::ParseForeachExpression() { |
- CXFA_FMExpression* e = 0; |
- CFX_WideStringC wsIdentifier; |
- CFX_PtrArray* pAccessors = 0; |
- CXFA_FMExpression* pList = 0; |
- FX_DWORD line = m_pToken->m_uLinenum; |
- NextToken(); |
- if (m_pToken->m_type != TOKidentifier) { |
- CFX_WideString ws_TempString = m_pToken->m_wstring; |
- Error(m_pToken->m_uLinenum, FMERR_EXPECTED_TOKEN, |
- XFA_FM_KeywordToString(m_pToken->m_type), ws_TempString.c_str()); |
- } |
- wsIdentifier = m_pToken->m_wstring; |
- NextToken(); |
- Check(TOKin); |
- Check(TOKlparen); |
- if (m_pToken->m_type == TOKrparen) { |
- CFX_WideString ws_TempString = m_pToken->m_wstring; |
- Error(m_pToken->m_uLinenum, FMERR_UNEXPECTED_EXPRESSION, |
- ws_TempString.c_str()); |
- NextToken(); |
- } else { |
- pAccessors = new CFX_PtrArray(); |
- while (m_pToken->m_type != TOKrparen) { |
- CXFA_FMSimpleExpression* s = ParseSimpleExpression(); |
- if (s) { |
- pAccessors->Add(s); |
- } |
- if (m_pToken->m_type == TOKcomma) { |
- NextToken(); |
- } else { |
- break; |
- } |
- } |
- Check(TOKrparen); |
- } |
- Check(TOKdo); |
- pList = ParseBlockExpression(); |
- Check(TOKendfor); |
- if (m_pErrorInfo->message.IsEmpty()) { |
- e = new CXFA_FMForeachExpression(line, wsIdentifier, pAccessors, pList); |
- } else { |
- if (pAccessors) { |
- CXFA_FMSimpleExpression* s = 0; |
- int32_t size = pAccessors->GetSize(); |
- int32_t index = 0; |
- while (index < size) { |
- s = (CXFA_FMSimpleExpression*)pAccessors->GetAt(index); |
- delete s; |
- index++; |
- } |
- pAccessors->RemoveAll(); |
- delete pAccessors; |
- pAccessors = 0; |
- } |
- if (pList) { |
- delete pList; |
- } |
- } |
- return e; |
-} |
-CXFA_FMExpression* CXFA_FMParse::ParseDoExpression() { |
- CXFA_FMExpression* e = 0; |
- FX_DWORD line = m_pToken->m_uLinenum; |
- NextToken(); |
- e = ParseBlockExpression(); |
- Check(TOKend); |
- if (m_pErrorInfo->message.IsEmpty()) { |
- e = new CXFA_FMDoExpression(line, e); |
- } else { |
- delete e; |
- e = 0; |
- } |
- return e; |
-} |
+// 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 |
+ |
+#include "xfa_fm2js.h" |
+CXFA_FMParse::CXFA_FMParse() { |
+ m_pScript = 0; |
+ m_uLength = 0; |
+ m_pErrorInfo = 0; |
+ m_lexer = 0; |
+ m_pToken = 0; |
+} |
+CXFA_FMParse::~CXFA_FMParse() { |
+ if (m_lexer) { |
+ delete m_lexer; |
+ } |
+ m_lexer = 0; |
+ m_pErrorInfo = 0; |
+ m_pScript = 0; |
+ m_pToken = 0; |
+} |
+int32_t CXFA_FMParse::Init(const CFX_WideStringC& wsFormcalc, |
+ CXFA_FMErrorInfo* pErrorInfo) { |
+ m_pScript = wsFormcalc.GetPtr(); |
+ m_uLength = wsFormcalc.GetLength(); |
+ m_pErrorInfo = pErrorInfo; |
+ m_lexer = new CXFA_FMLexer(wsFormcalc, m_pErrorInfo); |
+ if (m_lexer == 0) { |
+ return -1; |
+ } |
+ return 0; |
+} |
+void CXFA_FMParse::NextToken() { |
+ m_pToken = m_lexer->NextToken(); |
+ while (m_pToken->m_type == TOKreserver) { |
+ if (m_lexer->HasError()) { |
+ break; |
+ } |
+ m_pToken = m_lexer->NextToken(); |
+ } |
+} |
+void CXFA_FMParse::Check(XFA_FM_TOKEN op) { |
+ if (m_pToken->m_type != op) { |
+ CFX_WideString ws_TempString = m_pToken->m_wstring; |
+ Error(m_pToken->m_uLinenum, FMERR_EXPECTED_TOKEN, |
+ XFA_FM_KeywordToString(op), ws_TempString.c_str()); |
+ } |
+ NextToken(); |
+} |
+void CXFA_FMParse::Error(FX_DWORD lineNum, XFA_FM_ERRMSG msg, ...) { |
+ m_pErrorInfo->linenum = lineNum; |
+ const FX_WCHAR* lpMessageInfo = XFA_FM_ErrorMsg(msg); |
+ va_list ap; |
+ va_start(ap, msg); |
+ m_pErrorInfo->message.FormatV(lpMessageInfo, ap); |
+ va_end(ap); |
+} |
+CFX_PtrArray* CXFA_FMParse::ParseTopExpression() { |
+ CXFA_FMExpression* e = 0; |
+ CFX_PtrArray* expression = new CFX_PtrArray(); |
+ while (1) { |
+ if (m_pToken->m_type == TOKeof) { |
+ return expression; |
+ } |
+ if (m_pToken->m_type == TOKendfunc) { |
+ return expression; |
+ } |
+ if (m_pToken->m_type == TOKendif) { |
+ return expression; |
+ } |
+ if (m_pToken->m_type == TOKelseif) { |
+ return expression; |
+ } |
+ if (m_pToken->m_type == TOKelse) { |
+ return expression; |
+ } |
+ if (m_pToken->m_type == TOKfunc) { |
+ e = ParseFunction(); |
+ if (e) { |
+ expression->Add(e); |
+ } else { |
+ break; |
+ } |
+ } else { |
+ e = ParseExpression(); |
+ if (e) { |
+ expression->Add(e); |
+ } else { |
+ break; |
+ } |
+ } |
+ } |
+ return expression; |
+} |
+CXFA_FMExpression* CXFA_FMParse::ParseFunction() { |
+ CXFA_FMExpression* e = 0; |
+ CFX_WideStringC ident; |
+ CFX_WideStringCArray* pArguments = 0; |
+ CFX_PtrArray* pExpressions = 0; |
+ FX_DWORD line = m_pToken->m_uLinenum; |
+ NextToken(); |
+ if (m_pToken->m_type != TOKidentifier) { |
+ CFX_WideString ws_TempString = m_pToken->m_wstring; |
+ Error(m_pToken->m_uLinenum, FMERR_EXPECTED_IDENTIFIER, |
+ ws_TempString.c_str()); |
+ } else { |
+ ident = m_pToken->m_wstring; |
+ NextToken(); |
+ } |
+ Check(TOKlparen); |
+ if (m_pToken->m_type == TOKrparen) { |
+ NextToken(); |
+ } else { |
+ pArguments = new CFX_WideStringCArray(); |
+ CFX_WideStringC p; |
+ while (1) { |
+ if (m_pToken->m_type == TOKidentifier) { |
+ p = m_pToken->m_wstring; |
+ pArguments->Add(p); |
+ NextToken(); |
+ if (m_pToken->m_type == TOKcomma) { |
+ NextToken(); |
+ continue; |
+ } else if (m_pToken->m_type == TOKrparen) { |
+ NextToken(); |
+ break; |
+ } else { |
+ Check(TOKrparen); |
+ break; |
+ } |
+ } else { |
+ CFX_WideString ws_TempString = m_pToken->m_wstring; |
+ Error(m_pToken->m_uLinenum, FMERR_EXPECTED_IDENTIFIER, |
+ ws_TempString.c_str()); |
+ NextToken(); |
+ break; |
+ } |
+ } |
+ } |
+ Check(TOKdo); |
+ if (m_pToken->m_type == TOKendfunc) { |
+ NextToken(); |
+ } else { |
+ pExpressions = ParseTopExpression(); |
+ Check(TOKendfunc); |
+ } |
+ if (m_pErrorInfo->message.IsEmpty()) { |
+ e = new CXFA_FMFunctionDefinition(line, 0, ident, pArguments, pExpressions); |
+ } else { |
+ int32_t size = 0; |
+ int32_t index = 0; |
+ if (pArguments) { |
+ pArguments->RemoveAll(); |
+ delete pArguments; |
+ pArguments = 0; |
+ } |
+ index = 0; |
+ if (pExpressions) { |
+ CXFA_FMExpression* e1 = 0; |
+ size = pExpressions->GetSize(); |
+ while (index < size) { |
+ e1 = (CXFA_FMExpression*)pExpressions->GetAt(index); |
+ delete e1; |
+ index++; |
+ } |
+ pExpressions->RemoveAll(); |
+ delete pExpressions; |
+ pExpressions = 0; |
+ } |
+ } |
+ return e; |
+} |
+CXFA_FMExpression* CXFA_FMParse::ParseExpression() { |
+ CXFA_FMExpression* e = 0; |
+ FX_DWORD line = m_pToken->m_uLinenum; |
+ switch (m_pToken->m_type) { |
+ case TOKvar: |
+ e = ParseVarExpression(); |
+ break; |
+ case TOKnull: |
+ case TOKnumber: |
+ case TOKstring: |
+ case TOKplus: |
+ case TOKminus: |
+ case TOKksnot: |
+ case TOKidentifier: |
+ case TOKlparen: |
+ e = ParseExpExpression(); |
+ break; |
+ case TOKif: |
+ e = ParseIfExpression(); |
+ break; |
+ case TOKwhile: |
+ e = ParseWhileExpression(); |
+ break; |
+ case TOKfor: |
+ e = ParseForExpression(); |
+ break; |
+ case TOKforeach: |
+ e = ParseForeachExpression(); |
+ break; |
+ case TOKdo: |
+ e = ParseDoExpression(); |
+ break; |
+ case TOKbreak: |
+ e = new CXFA_FMBreakExpression(line); |
+ NextToken(); |
+ break; |
+ case TOKcontinue: |
+ e = new CXFA_FMContinueExpression(line); |
+ NextToken(); |
+ break; |
+ default: |
+ CFX_WideString ws_TempString = m_pToken->m_wstring; |
+ Error(m_pToken->m_uLinenum, FMERR_UNEXPECTED_EXPRESSION, |
+ ws_TempString.c_str()); |
+ NextToken(); |
+ break; |
+ } |
+ return e; |
+} |
+CXFA_FMExpression* CXFA_FMParse::ParseVarExpression() { |
+ CXFA_FMExpression* e = 0; |
+ CFX_WideStringC ident; |
+ FX_DWORD line = m_pToken->m_uLinenum; |
+ NextToken(); |
+ if (m_pToken->m_type != TOKidentifier) { |
+ CFX_WideString ws_TempString = m_pToken->m_wstring; |
+ Error(m_pToken->m_uLinenum, FMERR_EXPECTED_IDENTIFIER, |
+ ws_TempString.c_str()); |
+ } else { |
+ ident = m_pToken->m_wstring; |
+ NextToken(); |
+ } |
+ if (m_pToken->m_type == TOKassign) { |
+ NextToken(); |
+ e = ParseExpExpression(); |
+ } |
+ if (m_pErrorInfo->message.IsEmpty()) { |
+ e = new CXFA_FMVarExpression(line, ident, e); |
+ } else { |
+ delete e; |
+ e = 0; |
+ } |
+ return e; |
+} |
+CXFA_FMSimpleExpression* CXFA_FMParse::ParseSimpleExpression() { |
+ FX_DWORD line = m_pToken->m_uLinenum; |
+ CXFA_FMSimpleExpression *pExp1 = 0, *pExp2 = 0; |
+ pExp1 = ParseLogicalOrExpression(); |
+ while (m_pToken->m_type == TOKassign) { |
+ NextToken(); |
+ pExp2 = ParseLogicalOrExpression(); |
+ if (m_pErrorInfo->message.IsEmpty()) { |
+ pExp1 = new CXFA_FMAssignExpression(line, TOKassign, pExp1, pExp2); |
+ } else { |
+ delete pExp1; |
+ pExp1 = 0; |
+ } |
+ } |
+ return pExp1; |
+} |
+CXFA_FMExpression* CXFA_FMParse::ParseExpExpression() { |
+ CXFA_FMExpression* e = 0; |
+ FX_DWORD line = m_pToken->m_uLinenum; |
+ CXFA_FMSimpleExpression* pExp1 = 0; |
+ pExp1 = ParseSimpleExpression(); |
+ if (m_pErrorInfo->message.IsEmpty()) { |
+ e = new CXFA_FMExpExpression(line, pExp1); |
+ } else { |
+ delete pExp1; |
+ e = 0; |
+ } |
+ return e; |
+} |
+CXFA_FMSimpleExpression* CXFA_FMParse::ParseLogicalOrExpression() { |
+ CXFA_FMSimpleExpression *e1 = 0, *e2 = 0; |
+ FX_DWORD line = m_pToken->m_uLinenum; |
+ e1 = ParseLogicalAndExpression(); |
+ for (;;) { |
+ switch (m_pToken->m_type) { |
+ case TOKor: |
+ case TOKksor: |
+ NextToken(); |
+ e2 = ParseLogicalAndExpression(); |
+ if (m_pErrorInfo->message.IsEmpty()) { |
+ e1 = new CXFA_FMLogicalOrExpression(line, TOKor, e1, e2); |
+ } else { |
+ delete e1; |
+ e1 = 0; |
+ } |
+ continue; |
+ default: |
+ break; |
+ } |
+ break; |
+ } |
+ return e1; |
+} |
+CXFA_FMSimpleExpression* CXFA_FMParse::ParseLogicalAndExpression() { |
+ CXFA_FMSimpleExpression *e1 = 0, *e2 = 0; |
+ FX_DWORD line = m_pToken->m_uLinenum; |
+ e1 = ParseEqualityExpression(); |
+ for (;;) { |
+ switch (m_pToken->m_type) { |
+ case TOKand: |
+ case TOKksand: |
+ NextToken(); |
+ e2 = ParseEqualityExpression(); |
+ if (m_pErrorInfo->message.IsEmpty()) { |
+ e1 = new CXFA_FMLogicalAndExpression(line, TOKand, e1, e2); |
+ } else { |
+ delete e1; |
+ e1 = 0; |
+ } |
+ continue; |
+ default: |
+ break; |
+ } |
+ break; |
+ } |
+ return e1; |
+} |
+CXFA_FMSimpleExpression* CXFA_FMParse::ParseEqualityExpression() { |
+ CXFA_FMSimpleExpression *e1 = 0, *e2 = 0; |
+ FX_DWORD line = m_pToken->m_uLinenum; |
+ e1 = ParseRelationalExpression(); |
+ for (;;) { |
+ switch (m_pToken->m_type) { |
+ case TOKeq: |
+ case TOKkseq: |
+ NextToken(); |
+ e2 = ParseRelationalExpression(); |
+ if (m_pErrorInfo->message.IsEmpty()) { |
+ e1 = new CXFA_FMEqualityExpression(line, TOKeq, e1, e2); |
+ } else { |
+ delete e1; |
+ e1 = 0; |
+ } |
+ continue; |
+ case TOKne: |
+ case TOKksne: |
+ NextToken(); |
+ e2 = ParseRelationalExpression(); |
+ if (m_pErrorInfo->message.IsEmpty()) { |
+ e1 = new CXFA_FMEqualityExpression(line, TOKne, e1, e2); |
+ } else { |
+ delete e1; |
+ e1 = 0; |
+ } |
+ continue; |
+ default: |
+ break; |
+ } |
+ break; |
+ } |
+ return e1; |
+} |
+CXFA_FMSimpleExpression* CXFA_FMParse::ParseRelationalExpression() { |
+ CXFA_FMSimpleExpression *e1 = 0, *e2 = 0; |
+ FX_DWORD line = m_pToken->m_uLinenum; |
+ e1 = ParseAddtiveExpression(); |
+ for (;;) { |
+ switch (m_pToken->m_type) { |
+ case TOKlt: |
+ case TOKkslt: |
+ NextToken(); |
+ e2 = ParseAddtiveExpression(); |
+ if (m_pErrorInfo->message.IsEmpty()) { |
+ e1 = new CXFA_FMRelationalExpression(line, TOKlt, e1, e2); |
+ } else { |
+ delete e1; |
+ e1 = 0; |
+ } |
+ continue; |
+ case TOKgt: |
+ case TOKksgt: |
+ NextToken(); |
+ e2 = ParseAddtiveExpression(); |
+ if (m_pErrorInfo->message.IsEmpty()) { |
+ e1 = new CXFA_FMRelationalExpression(line, TOKgt, e1, e2); |
+ } else { |
+ delete e1; |
+ e1 = 0; |
+ } |
+ continue; |
+ case TOKle: |
+ case TOKksle: |
+ NextToken(); |
+ e2 = ParseAddtiveExpression(); |
+ if (m_pErrorInfo->message.IsEmpty()) { |
+ e1 = new CXFA_FMRelationalExpression(line, TOKle, e1, e2); |
+ } else { |
+ delete e1; |
+ e1 = 0; |
+ } |
+ continue; |
+ case TOKge: |
+ case TOKksge: |
+ NextToken(); |
+ e2 = ParseAddtiveExpression(); |
+ if (m_pErrorInfo->message.IsEmpty()) { |
+ e1 = new CXFA_FMRelationalExpression(line, TOKge, e1, e2); |
+ } else { |
+ delete e1; |
+ e1 = 0; |
+ } |
+ continue; |
+ default: |
+ break; |
+ } |
+ break; |
+ } |
+ return e1; |
+} |
+CXFA_FMSimpleExpression* CXFA_FMParse::ParseAddtiveExpression() { |
+ CXFA_FMSimpleExpression *e1 = 0, *e2 = 0; |
+ FX_DWORD line = m_pToken->m_uLinenum; |
+ e1 = ParseMultiplicativeExpression(); |
+ for (;;) { |
+ switch (m_pToken->m_type) { |
+ case TOKplus: |
+ NextToken(); |
+ e2 = ParseMultiplicativeExpression(); |
+ if (m_pErrorInfo->message.IsEmpty()) { |
+ e1 = new CXFA_FMAdditiveExpression(line, TOKplus, e1, e2); |
+ } else { |
+ delete e1; |
+ e1 = 0; |
+ } |
+ continue; |
+ case TOKminus: |
+ NextToken(); |
+ e2 = ParseMultiplicativeExpression(); |
+ if (m_pErrorInfo->message.IsEmpty()) { |
+ e1 = new CXFA_FMAdditiveExpression(line, TOKminus, e1, e2); |
+ } else { |
+ delete e1; |
+ e1 = 0; |
+ } |
+ continue; |
+ default: |
+ break; |
+ } |
+ break; |
+ } |
+ return e1; |
+} |
+CXFA_FMSimpleExpression* CXFA_FMParse::ParseMultiplicativeExpression() { |
+ CXFA_FMSimpleExpression *e1 = 0, *e2 = 0; |
+ FX_DWORD line = m_pToken->m_uLinenum; |
+ e1 = ParseUnaryExpression(); |
+ for (;;) { |
+ switch (m_pToken->m_type) { |
+ case TOKmul: |
+ NextToken(); |
+ e2 = ParseUnaryExpression(); |
+ if (m_pErrorInfo->message.IsEmpty()) { |
+ e1 = new CXFA_FMMultiplicativeExpression(line, TOKmul, e1, e2); |
+ } else { |
+ delete e1; |
+ e1 = 0; |
+ } |
+ continue; |
+ case TOKdiv: |
+ NextToken(); |
+ e2 = ParseUnaryExpression(); |
+ if (m_pErrorInfo->message.IsEmpty()) { |
+ e1 = new CXFA_FMMultiplicativeExpression(line, TOKdiv, e1, e2); |
+ } else { |
+ delete e1; |
+ e1 = 0; |
+ } |
+ continue; |
+ default: |
+ break; |
+ } |
+ break; |
+ } |
+ return e1; |
+} |
+CXFA_FMSimpleExpression* CXFA_FMParse::ParseUnaryExpression() { |
+ CXFA_FMSimpleExpression* e = 0; |
+ FX_DWORD line = m_pToken->m_uLinenum; |
+ switch (m_pToken->m_type) { |
+ case TOKplus: |
+ NextToken(); |
+ e = ParseUnaryExpression(); |
+ if (m_pErrorInfo->message.IsEmpty()) { |
+ e = new CXFA_FMPosExpression(line, e); |
+ } else { |
+ e = 0; |
+ } |
+ break; |
+ case TOKminus: |
+ NextToken(); |
+ e = ParseUnaryExpression(); |
+ if (m_pErrorInfo->message.IsEmpty()) { |
+ e = new CXFA_FMNegExpression(line, e); |
+ } else { |
+ e = 0; |
+ } |
+ break; |
+ case TOKksnot: |
+ NextToken(); |
+ e = ParseUnaryExpression(); |
+ if (m_pErrorInfo->message.IsEmpty()) { |
+ e = new CXFA_FMNotExpression(line, e); |
+ } else { |
+ e = 0; |
+ } |
+ break; |
+ default: |
+ e = ParsePrimaryExpression(); |
+ break; |
+ } |
+ return e; |
+} |
+CXFA_FMSimpleExpression* CXFA_FMParse::ParsePrimaryExpression() { |
+ CXFA_FMSimpleExpression* e = 0; |
+ FX_DWORD line = m_pToken->m_uLinenum; |
+ switch (m_pToken->m_type) { |
+ case TOKnumber: |
+ e = new CXFA_FMNumberExpression(line, m_pToken->m_wstring); |
+ NextToken(); |
+ break; |
+ case TOKstring: |
+ e = new CXFA_FMStringExpression(line, m_pToken->m_wstring); |
+ NextToken(); |
+ break; |
+ case TOKidentifier: { |
+ CFX_WideStringC wsIdentifier(m_pToken->m_wstring); |
+ NextToken(); |
+ if (m_pToken->m_type == TOKlbracket) { |
+ CXFA_FMSimpleExpression* s = ParseIndexExpression(); |
+ if (s) { |
+ e = new CXFA_FMDotAccessorExpression(line, NULL, TOKdot, wsIdentifier, |
+ s); |
+ } |
+ NextToken(); |
+ } else { |
+ e = new CXFA_FMIdentifierExpressionn(line, wsIdentifier); |
+ } |
+ } break; |
+ case TOKif: |
+ e = new CXFA_FMIdentifierExpressionn(line, m_pToken->m_wstring); |
+ NextToken(); |
+ break; |
+ case TOKnull: |
+ e = new CXFA_FMNullExpression(line); |
+ NextToken(); |
+ break; |
+ case TOKlparen: |
+ e = ParseParenExpression(); |
+ break; |
+ default: |
+ CFX_WideString ws_TempString = m_pToken->m_wstring; |
+ Error(m_pToken->m_uLinenum, FMERR_UNEXPECTED_EXPRESSION, |
+ ws_TempString.c_str()); |
+ NextToken(); |
+ break; |
+ } |
+ e = ParsePostExpression(e); |
+ if (!(m_pErrorInfo->message.IsEmpty())) { |
+ delete e; |
+ e = 0; |
+ } |
+ return e; |
+} |
+CXFA_FMSimpleExpression* CXFA_FMParse::ParsePostExpression( |
+ CXFA_FMSimpleExpression* e) { |
+ FX_DWORD line = m_pToken->m_uLinenum; |
+ while (1) { |
+ switch (m_pToken->m_type) { |
+ case TOKlparen: { |
+ NextToken(); |
+ CFX_PtrArray* pArray = 0; |
+ if (m_pToken->m_type != TOKrparen) { |
+ pArray = new CFX_PtrArray(); |
+ while (m_pToken->m_type != TOKrparen) { |
+ CXFA_FMSimpleExpression* e = ParseSimpleExpression(); |
+ if (e) { |
+ pArray->Add(e); |
+ } |
+ if (m_pToken->m_type == TOKcomma) { |
+ NextToken(); |
+ } else if (m_pToken->m_type == TOKeof) { |
+ break; |
+ } |
+ } |
+ if (m_pToken->m_type != TOKrparen) { |
+ CFX_WideString ws_TempString = m_pToken->m_wstring; |
+ Error(m_pToken->m_uLinenum, FMERR_EXPECTED_TOKEN, |
+ XFA_FM_KeywordToString(TOKrparen), ws_TempString.c_str()); |
+ } |
+ } |
+ if (m_pErrorInfo->message.IsEmpty()) { |
+ e = new CXFA_FMCallExpression(line, e, pArray, FALSE); |
+ NextToken(); |
+ if (m_pToken->m_type != TOKlbracket) { |
+ continue; |
+ } |
+ CXFA_FMSimpleExpression* s = ParseIndexExpression(); |
+ if (s) { |
+ e = new CXFA_FMDotAccessorExpression(line, e, TOKcall, |
+ FX_WSTRC(L""), s); |
+ } else { |
+ delete e; |
+ e = 0; |
+ } |
+ } else { |
+ int32_t iSize = pArray->GetSize(); |
+ for (int32_t i = 0; i < iSize; ++i) { |
+ CXFA_FMSimpleExpression* pTemp = |
+ (CXFA_FMSimpleExpression*)pArray->GetAt(i); |
+ delete pTemp; |
+ } |
+ delete pArray; |
+ delete e; |
+ e = 0; |
+ } |
+ } break; |
+ case TOKdot: |
+ NextToken(); |
+ if (m_pToken->m_type == TOKidentifier) { |
+ CFX_WideStringC tempStr = m_pToken->m_wstring; |
+ FX_DWORD tempLine = m_pToken->m_uLinenum; |
+ NextToken(); |
+ if (m_pToken->m_type == TOKlparen) { |
+ CXFA_FMSimpleExpression* pExpAccessor; |
+ CXFA_FMSimpleExpression* pExpCall; |
+ pExpAccessor = e; |
+ NextToken(); |
+ CFX_PtrArray* pArray = 0; |
+ if (m_pToken->m_type != TOKrparen) { |
+ pArray = new CFX_PtrArray(); |
+ while (m_pToken->m_type != TOKrparen) { |
+ CXFA_FMSimpleExpression* exp = ParseSimpleExpression(); |
+ pArray->Add(exp); |
+ if (m_pToken->m_type == TOKcomma) { |
+ NextToken(); |
+ } else if (m_pToken->m_type == TOKeof) { |
+ break; |
+ } |
+ } |
+ if (m_pToken->m_type != TOKrparen) { |
+ CFX_WideString ws_TempString = m_pToken->m_wstring; |
+ Error(m_pToken->m_uLinenum, FMERR_EXPECTED_TOKEN, |
+ XFA_FM_KeywordToString(TOKrparen), ws_TempString.c_str()); |
+ } |
+ } |
+ if (m_pErrorInfo->message.IsEmpty()) { |
+ CXFA_FMSimpleExpression* pIdentifier = |
+ new CXFA_FMIdentifierExpressionn(tempLine, tempStr); |
+ pExpCall = |
+ new CXFA_FMCallExpression(line, pIdentifier, pArray, TRUE); |
+ e = new CXFA_FMMethodCallExpression(line, pExpAccessor, pExpCall); |
+ NextToken(); |
+ if (m_pToken->m_type != TOKlbracket) { |
+ continue; |
+ } |
+ CXFA_FMSimpleExpression* s = ParseIndexExpression(); |
+ if (s) { |
+ e = new CXFA_FMDotAccessorExpression(line, e, TOKcall, |
+ FX_WSTRC(L""), s); |
+ } else { |
+ delete e; |
+ e = 0; |
+ } |
+ } else { |
+ int32_t iSize = pArray->GetSize(); |
+ for (int32_t i = 0; i < iSize; ++i) { |
+ CXFA_FMSimpleExpression* pTemp = |
+ (CXFA_FMSimpleExpression*)pArray->GetAt(i); |
+ delete pTemp; |
+ } |
+ delete pArray; |
+ delete e; |
+ e = 0; |
+ } |
+ } else if (m_pToken->m_type == TOKlbracket) { |
+ CXFA_FMSimpleExpression* s = ParseIndexExpression(); |
+ if (!(m_pErrorInfo->message.IsEmpty())) { |
+ if (s) { |
+ delete s; |
+ s = 0; |
+ } |
+ if (e) { |
+ delete e; |
+ e = 0; |
+ } |
+ return e; |
+ } |
+ e = new CXFA_FMDotAccessorExpression(tempLine, e, TOKdot, tempStr, |
+ s); |
+ } else { |
+ CXFA_FMSimpleExpression* s = new CXFA_FMIndexExpression( |
+ tempLine, ACCESSOR_NO_INDEX, NULL, FALSE); |
+ e = new CXFA_FMDotAccessorExpression(line, e, TOKdot, tempStr, s); |
+ continue; |
+ } |
+ } else { |
+ CFX_WideString ws_TempString = m_pToken->m_wstring; |
+ Error(m_pToken->m_uLinenum, FMERR_EXPECTED_IDENTIFIER, |
+ ws_TempString.c_str()); |
+ return e; |
+ } |
+ break; |
+ case TOKdotdot: |
+ NextToken(); |
+ if (m_pToken->m_type == TOKidentifier) { |
+ CFX_WideStringC tempStr = m_pToken->m_wstring; |
+ FX_DWORD tempLine = m_pToken->m_uLinenum; |
+ NextToken(); |
+ if (m_pToken->m_type == TOKlbracket) { |
+ CXFA_FMSimpleExpression* s = ParseIndexExpression(); |
+ if (!(m_pErrorInfo->message.IsEmpty())) { |
+ if (s) { |
+ delete s; |
+ s = 0; |
+ } |
+ if (e) { |
+ delete e; |
+ e = 0; |
+ } |
+ return e; |
+ } |
+ e = new CXFA_FMDotDotAccessorExpression(tempLine, e, TOKdotdot, |
+ tempStr, s); |
+ } else { |
+ CXFA_FMSimpleExpression* s = new CXFA_FMIndexExpression( |
+ tempLine, ACCESSOR_NO_INDEX, NULL, FALSE); |
+ e = new CXFA_FMDotDotAccessorExpression(line, e, TOKdotdot, tempStr, |
+ s); |
+ continue; |
+ } |
+ } else { |
+ CFX_WideString ws_TempString = m_pToken->m_wstring; |
+ Error(m_pToken->m_uLinenum, FMERR_EXPECTED_IDENTIFIER, |
+ ws_TempString.c_str()); |
+ return e; |
+ } |
+ break; |
+ case TOKdotscream: |
+ NextToken(); |
+ if (m_pToken->m_type == TOKidentifier) { |
+ CFX_WideStringC tempStr = m_pToken->m_wstring; |
+ FX_DWORD tempLine = m_pToken->m_uLinenum; |
+ NextToken(); |
+ if (m_pToken->m_type == TOKlbracket) { |
+ CXFA_FMSimpleExpression* s = ParseIndexExpression(); |
+ if (!(m_pErrorInfo->message.IsEmpty())) { |
+ if (s) { |
+ delete s; |
+ s = 0; |
+ } |
+ if (e) { |
+ delete e; |
+ e = 0; |
+ } |
+ return e; |
+ } |
+ e = new CXFA_FMDotAccessorExpression(tempLine, e, TOKdotscream, |
+ tempStr, s); |
+ } else { |
+ CXFA_FMSimpleExpression* s = new CXFA_FMIndexExpression( |
+ tempLine, ACCESSOR_NO_INDEX, NULL, FALSE); |
+ e = new CXFA_FMDotAccessorExpression(line, e, TOKdotscream, tempStr, |
+ s); |
+ continue; |
+ } |
+ } else { |
+ CFX_WideString ws_TempString = m_pToken->m_wstring; |
+ Error(m_pToken->m_uLinenum, FMERR_EXPECTED_IDENTIFIER, |
+ ws_TempString.c_str()); |
+ return e; |
+ } |
+ break; |
+ case TOKdotstar: { |
+ CXFA_FMSimpleExpression* s = |
+ new CXFA_FMIndexExpression(line, ACCESSOR_NO_INDEX, NULL, FALSE); |
+ e = new CXFA_FMDotAccessorExpression(line, e, TOKdotstar, |
+ FX_WSTRC(L"*"), s); |
+ } break; |
+ default: |
+ return e; |
+ } |
+ NextToken(); |
+ } |
+ return e; |
+} |
+CXFA_FMSimpleExpression* CXFA_FMParse::ParseIndexExpression() { |
+ CXFA_FMSimpleExpression* pExp = 0; |
+ FX_DWORD line = m_pToken->m_uLinenum; |
+ NextToken(); |
+ CXFA_FMSimpleExpression* s = 0; |
+ XFA_FM_AccessorIndex accessorIndex = ACCESSOR_NO_RELATIVEINDEX; |
+ if (m_pToken->m_type == TOKmul) { |
+ pExp = new CXFA_FMIndexExpression(line, accessorIndex, s, TRUE); |
+ NextToken(); |
+ if (m_pToken->m_type != TOKrbracket) { |
+ CFX_WideString ws_TempString = m_pToken->m_wstring; |
+ Error(m_pToken->m_uLinenum, FMERR_EXPECTED_TOKEN, |
+ XFA_FM_KeywordToString(TOKrparen), ws_TempString.c_str()); |
+ if (pExp) { |
+ delete pExp; |
+ pExp = 0; |
+ } |
+ } |
+ return pExp; |
+ } |
+ if (m_pToken->m_type == TOKplus) { |
+ accessorIndex = ACCESSOR_POSITIVE_INDEX; |
+ NextToken(); |
+ } else if (m_pToken->m_type == TOKminus) { |
+ accessorIndex = ACCESSOR_NEGATIVE_INDEX; |
+ NextToken(); |
+ } |
+ s = ParseSimpleExpression(); |
+ if (m_pToken->m_type != TOKrbracket) { |
+ CFX_WideString ws_TempString = m_pToken->m_wstring; |
+ Error(m_pToken->m_uLinenum, FMERR_EXPECTED_TOKEN, |
+ XFA_FM_KeywordToString(TOKrparen), ws_TempString.c_str()); |
+ if (s) { |
+ delete s; |
+ } |
+ } else { |
+ pExp = new CXFA_FMIndexExpression(line, accessorIndex, s, FALSE); |
+ } |
+ return pExp; |
+} |
+CXFA_FMSimpleExpression* CXFA_FMParse::ParseParenExpression() { |
+ CXFA_FMSimpleExpression *pExp1 = 0, *pExp2 = 0; |
+ FX_DWORD line = m_pToken->m_uLinenum; |
+ Check(TOKlparen); |
+ if (m_pToken->m_type != TOKrparen) { |
+ pExp1 = ParseLogicalOrExpression(); |
+ while (m_pToken->m_type == TOKassign) { |
+ NextToken(); |
+ pExp2 = ParseLogicalOrExpression(); |
+ if (m_pErrorInfo->message.IsEmpty()) { |
+ pExp1 = new CXFA_FMAssignExpression(line, TOKassign, pExp1, pExp2); |
+ } else { |
+ delete pExp1; |
+ pExp1 = 0; |
+ } |
+ } |
+ Check(TOKrparen); |
+ } else { |
+ NextToken(); |
+ } |
+ return pExp1; |
+} |
+CXFA_FMExpression* CXFA_FMParse::ParseBlockExpression() { |
+ FX_DWORD line = m_pToken->m_uLinenum; |
+ CXFA_FMExpression* e = 0; |
+ CFX_PtrArray* expression = new CFX_PtrArray(); |
+ while (1) { |
+ switch (m_pToken->m_type) { |
+ case TOKeof: |
+ case TOKendif: |
+ case TOKelseif: |
+ case TOKelse: |
+ case TOKendwhile: |
+ case TOKendfor: |
+ case TOKend: |
+ case TOKendfunc: |
+ break; |
+ case TOKfunc: |
+ e = ParseFunction(); |
+ if (e) { |
+ expression->Add(e); |
+ } |
+ continue; |
+ default: |
+ e = ParseExpression(); |
+ if (e) { |
+ expression->Add(e); |
+ } |
+ continue; |
+ } |
+ break; |
+ } |
+ CXFA_FMBlockExpression* pExp = 0; |
+ if (m_pErrorInfo->message.IsEmpty()) { |
+ pExp = new CXFA_FMBlockExpression(line, expression); |
+ } else { |
+ int32_t size = expression->GetSize(); |
+ int32_t index = 0; |
+ while (index < size) { |
+ e = (CXFA_FMExpression*)expression->GetAt(index); |
+ delete e; |
+ index++; |
+ } |
+ expression->RemoveAll(); |
+ delete expression; |
+ expression = 0; |
+ } |
+ return pExp; |
+} |
+CXFA_FMExpression* CXFA_FMParse::ParseIfExpression() { |
+ CXFA_FMSimpleExpression* pExpression = 0; |
+ CXFA_FMExpression* pIfExpression = 0; |
+ CXFA_FMExpression* pElseExpression = 0; |
+ FX_DWORD line = m_pToken->m_uLinenum; |
+ const FX_WCHAR* pStartPos = m_lexer->SavePos(); |
+ NextToken(); |
+ Check(TOKlparen); |
+ while (m_pToken->m_type != TOKrparen) { |
+ if (pExpression) { |
+ delete pExpression; |
+ } |
+ pExpression = ParseSimpleExpression(); |
+ if (m_pToken->m_type == TOKcomma) { |
+ NextToken(); |
+ } else { |
+ break; |
+ } |
+ } |
+ Check(TOKrparen); |
+ if (m_pToken->m_type != TOKthen) { |
+ if (pExpression) { |
+ delete pExpression; |
+ } |
+ m_lexer->SetCurrentLine(line); |
+ m_pToken = new CXFA_FMToken(line); |
+ m_pToken->m_type = TOKidentifier; |
+ m_pToken->m_wstring = FX_WSTRC(L"if"); |
+ m_lexer->SetToken(m_pToken); |
+ m_lexer->RestorePos(pStartPos); |
+ return ParseExpExpression(); |
+ } |
+ Check(TOKthen); |
+ pIfExpression = ParseBlockExpression(); |
+ switch (m_pToken->m_type) { |
+ case TOKeof: |
+ case TOKendif: |
+ Check(TOKendif); |
+ break; |
+ case TOKif: |
+ pElseExpression = ParseIfExpression(); |
+ Check(TOKendif); |
+ break; |
+ case TOKelseif: |
+ pElseExpression = ParseIfExpression(); |
+ break; |
+ case TOKelse: |
+ NextToken(); |
+ pElseExpression = ParseBlockExpression(); |
+ Check(TOKendif); |
+ break; |
+ default: |
+ CFX_WideString ws_TempString = m_pToken->m_wstring; |
+ Error(m_pToken->m_uLinenum, FMERR_EXPECTED_IFEND, ws_TempString.c_str()); |
+ NextToken(); |
+ break; |
+ } |
+ CXFA_FMIfExpression* pExp = 0; |
+ if (m_pErrorInfo->message.IsEmpty()) { |
+ pExp = new CXFA_FMIfExpression(line, pExpression, pIfExpression, |
+ pElseExpression); |
+ } else { |
+ if (pExpression) { |
+ delete pExpression; |
+ } |
+ if (pIfExpression) { |
+ delete pIfExpression; |
+ } |
+ if (pElseExpression) { |
+ delete pElseExpression; |
+ } |
+ } |
+ return pExp; |
+} |
+CXFA_FMExpression* CXFA_FMParse::ParseWhileExpression() { |
+ CXFA_FMExpression* e = 0; |
+ CXFA_FMSimpleExpression* pCondition = 0; |
+ CXFA_FMExpression* pExpression = 0; |
+ FX_DWORD line = m_pToken->m_uLinenum; |
+ NextToken(); |
+ pCondition = ParseParenExpression(); |
+ Check(TOKdo); |
+ pExpression = ParseBlockExpression(); |
+ Check(TOKendwhile); |
+ if (!m_pErrorInfo->message.IsEmpty()) { |
+ if (pCondition) { |
+ delete pCondition; |
+ } |
+ if (pExpression) { |
+ delete pExpression; |
+ } |
+ delete e; |
+ e = 0; |
+ } else { |
+ e = new CXFA_FMWhileExpression(line, pCondition, pExpression); |
+ } |
+ return e; |
+} |
+CXFA_FMSimpleExpression* CXFA_FMParse::ParseSubassignmentInForExpression() { |
+ CXFA_FMSimpleExpression* e = 0; |
+ switch (m_pToken->m_type) { |
+ case TOKidentifier: |
+ e = ParseSimpleExpression(); |
+ break; |
+ default: |
+ CFX_WideString ws_TempString = m_pToken->m_wstring; |
+ Error(m_pToken->m_uLinenum, FMERR_UNEXPECTED_EXPRESSION, |
+ ws_TempString.c_str()); |
+ NextToken(); |
+ break; |
+ } |
+ return e; |
+} |
+CXFA_FMExpression* CXFA_FMParse::ParseForExpression() { |
+ CXFA_FMExpression* e = 0; |
+ CFX_WideStringC wsVariant; |
+ CXFA_FMSimpleExpression* pAssignment = 0; |
+ CXFA_FMSimpleExpression* pAccessor = 0; |
+ CXFA_FMSimpleExpression* pStep = 0; |
+ CXFA_FMExpression* pList = 0; |
+ FX_DWORD line = m_pToken->m_uLinenum; |
+ NextToken(); |
+ if (m_pToken->m_type != TOKidentifier) { |
+ CFX_WideString ws_TempString = m_pToken->m_wstring; |
+ Error(m_pToken->m_uLinenum, FMERR_EXPECTED_TOKEN, |
+ XFA_FM_KeywordToString(m_pToken->m_type), ws_TempString.c_str()); |
+ } |
+ wsVariant = m_pToken->m_wstring; |
+ NextToken(); |
+ if (m_pToken->m_type == TOKassign) { |
+ NextToken(); |
+ pAssignment = ParseSimpleExpression(); |
+ } else { |
+ CFX_WideString ws_TempString = m_pToken->m_wstring; |
+ Error(m_pToken->m_uLinenum, FMERR_EXPECTED_TOKEN, |
+ XFA_FM_KeywordToString(m_pToken->m_type), ws_TempString.c_str()); |
+ } |
+ int32_t iDirection = 0; |
+ if (m_pToken->m_type == TOKupto) { |
+ iDirection = 1; |
+ } else if (m_pToken->m_type == TOKdownto) { |
+ iDirection = -1; |
+ } else { |
+ CFX_WideString ws_TempString = m_pToken->m_wstring; |
+ Error(m_pToken->m_uLinenum, FMERR_EXPECTED_TOKEN, L"upto or downto", |
+ (const FX_WCHAR*)ws_TempString); |
+ } |
+ NextToken(); |
+ pAccessor = ParseSimpleExpression(); |
+ if (m_pToken->m_type == TOKstep) { |
+ NextToken(); |
+ pStep = ParseSimpleExpression(); |
+ } |
+ Check(TOKdo); |
+ pList = ParseBlockExpression(); |
+ Check(TOKendfor); |
+ if (m_pErrorInfo->message.IsEmpty()) { |
+ e = new CXFA_FMForExpression(line, wsVariant, pAssignment, pAccessor, |
+ iDirection, pStep, pList); |
+ } else { |
+ if (pAssignment) { |
+ delete pAssignment; |
+ } |
+ if (pAccessor) { |
+ delete pAccessor; |
+ } |
+ if (pStep) { |
+ delete pStep; |
+ } |
+ if (pList) { |
+ delete pList; |
+ } |
+ } |
+ return e; |
+} |
+CXFA_FMExpression* CXFA_FMParse::ParseForeachExpression() { |
+ CXFA_FMExpression* e = 0; |
+ CFX_WideStringC wsIdentifier; |
+ CFX_PtrArray* pAccessors = 0; |
+ CXFA_FMExpression* pList = 0; |
+ FX_DWORD line = m_pToken->m_uLinenum; |
+ NextToken(); |
+ if (m_pToken->m_type != TOKidentifier) { |
+ CFX_WideString ws_TempString = m_pToken->m_wstring; |
+ Error(m_pToken->m_uLinenum, FMERR_EXPECTED_TOKEN, |
+ XFA_FM_KeywordToString(m_pToken->m_type), ws_TempString.c_str()); |
+ } |
+ wsIdentifier = m_pToken->m_wstring; |
+ NextToken(); |
+ Check(TOKin); |
+ Check(TOKlparen); |
+ if (m_pToken->m_type == TOKrparen) { |
+ CFX_WideString ws_TempString = m_pToken->m_wstring; |
+ Error(m_pToken->m_uLinenum, FMERR_UNEXPECTED_EXPRESSION, |
+ ws_TempString.c_str()); |
+ NextToken(); |
+ } else { |
+ pAccessors = new CFX_PtrArray(); |
+ while (m_pToken->m_type != TOKrparen) { |
+ CXFA_FMSimpleExpression* s = ParseSimpleExpression(); |
+ if (s) { |
+ pAccessors->Add(s); |
+ } |
+ if (m_pToken->m_type == TOKcomma) { |
+ NextToken(); |
+ } else { |
+ break; |
+ } |
+ } |
+ Check(TOKrparen); |
+ } |
+ Check(TOKdo); |
+ pList = ParseBlockExpression(); |
+ Check(TOKendfor); |
+ if (m_pErrorInfo->message.IsEmpty()) { |
+ e = new CXFA_FMForeachExpression(line, wsIdentifier, pAccessors, pList); |
+ } else { |
+ if (pAccessors) { |
+ CXFA_FMSimpleExpression* s = 0; |
+ int32_t size = pAccessors->GetSize(); |
+ int32_t index = 0; |
+ while (index < size) { |
+ s = (CXFA_FMSimpleExpression*)pAccessors->GetAt(index); |
+ delete s; |
+ index++; |
+ } |
+ pAccessors->RemoveAll(); |
+ delete pAccessors; |
+ pAccessors = 0; |
+ } |
+ if (pList) { |
+ delete pList; |
+ } |
+ } |
+ return e; |
+} |
+CXFA_FMExpression* CXFA_FMParse::ParseDoExpression() { |
+ CXFA_FMExpression* e = 0; |
+ FX_DWORD line = m_pToken->m_uLinenum; |
+ NextToken(); |
+ e = ParseBlockExpression(); |
+ Check(TOKend); |
+ if (m_pErrorInfo->message.IsEmpty()) { |
+ e = new CXFA_FMDoExpression(line, e); |
+ } else { |
+ delete e; |
+ e = 0; |
+ } |
+ return e; |
+} |