AstNodePtr SymbolicFunction :: CodeGen( AstInterface &_fa) const { AstInterface::AstNodeList l; for (const_iterator i = args.begin(); i != args.end(); ++i) { SymbolicVal cur = *i; AstNodePtr curast = cur.CodeGen(_fa); l.push_back(curast); } if (t == AstInterface::OP_NONE) { return _fa.CreateFunctionCall( op, l); } else if (t == AstInterface::OP_ARRAY_ACCESS) { AstNodePtr arr = l.front(); l.pop_front(); return _fa.CreateArrayAccess(arr, l); } else if (t == AstInterface::OP_ASSIGN && l.size() == 2) { return _fa.CreateAssignment(l.front(), l.back()); } else if (l.size() == 2) return _fa.CreateBinaryOP( t, l.front(), l.back()); else { assert(l.size() == 1); return _fa.CreateUnaryOP( t, l.front()); } }
AstNodePtr ArrayUseAccessFunction:: CreateArrayAccess( AstInterface& fa, const AstNodePtr& arr, AstInterface::AstNodeList& index) { if (prev != 0) return prev->CreateArrayAccess(fa, arr, index); if (index.size() > 1) { AstInterface::AstNodeList tmp = index; tmp.push_front(arr); return fa.CreateFunctionCall(funcname, tmp); } else return fa.CreateArrayAccess(arr, index); }