TVariablePtr ExpressionParser::Parse(StringPtrLen str) { CheckBracketBalance(str); TVariablePtr variable; auto assignment = FindWithZeroBalance(str, g_token_assignment); if (assignment != nullptr) { variable = ParseVariableDeclaration(str.Left(assignment)); str = str.Right(assignment + std::strlen(g_token_assignment)); } else { // Unnamed variable variable = std::make_unique<Variable>(); } m_curr_variable = variable.get(); auto expression = ParseExpression(str); m_curr_variable = nullptr; NormalizeExpression(expression); SimplifyExpression(expression); variable->SetExpression(std::move(expression)); return variable; }
PHPEntityBase::Ptr_t PHPExpression::Resolve(PHPLookupTable& lookpTable, const wxString& sourceFileName) { if(m_expression.empty()) return PHPEntityBase::Ptr_t(NULL); PHPSourceFile source(m_text); source.SetParseFunctionBody(true); source.SetFilename(sourceFileName); source.Parse(); wxString asString = SimplifyExpression(source, 0); // Now, use the lookup table std::list<PHPExpression::Part>::iterator iter = m_parts.begin(); PHPEntityBase::Ptr_t currentToken(NULL); for(; iter != m_parts.end(); ++iter) { if(!currentToken) { // first token currentToken = lookpTable.FindScope(iter->m_text); } else { // load the children of the current token (optionally, filter by the text) currentToken = lookpTable.FindMemberOf(currentToken->GetDbId(), iter->m_text); } if(!currentToken) { // return NULL return currentToken; } } return currentToken; }
expr_type make_un_op(int op, expr_type expr1) { expr_type e = (expr_type) SafeMalloc(sizeof(expr_struct)); e->type = E_UNARY_OP; e->value.unary_opval.exp = expr1; e->value.unary_opval.op = op; e->lineno = lineno; SimplifyExpression(e); return e; }
expr_type make_bin_op(expr_type expr1, int op, expr_type expr2) { expr_type e = (expr_type) SafeMalloc(sizeof(expr_struct)); e->type = E_BINARY_OP; e->value.binary_opval.left_exp = expr1; e->value.binary_opval.right_exp = expr2; e->value.binary_opval.op = op; e->lineno = lineno; SimplifyExpression(e); return e; }